#!/usr/bin/env bash GREEN='\033[0;32m' NC='\033[0m' # Verbose logging function log() { echo -e "${GREEN}[LOG]${NC} $1" } pacman-key --init # Variables USERNAME="" USER_PASSWORD="" ROOT_PASSWORD="" COMPUTER_NAME="" TIMEZONE="US/Eastern" DISK="" # Helper function to prompt for missing variables prompt_variable() { local prompt_msg var_name var_value var_name="$1" prompt_msg="$2" eval var_value=\$$var_name while [[ -z "$var_value" ]]; do read -p "$prompt_msg: " var_value if [[ -z "$var_value" ]]; then printf "\n%s\n\n" "This is a required field. Please enter a value." else eval $var_name='$var_value' fi done } # Partition variables PARTITION_COUNT=3 PARTITION1_SIZE="500M" PARTITION2_SIZE="2G" PARTITION_SIZES=() PARTITION_TYPES=() # Help function help() { echo "Arch Linux Installation Script" echo "This script automates the installation of Arch Linux." echo echo "Usage: $0 [options]" echo echo "Options:" echo " -u USERNAME Set the non-root username" echo " -p USER_PASSWORD Set the non-root user password" echo " -r ROOT_PASSWORD Set the root password" echo " -c COMPUTER_NAME Set the computer name" echo " -t TIMEZONE Set the timezone (default: US/Eastern)" echo " -d DISK Set the target disk (e.g., sdX or nvmeXn1)" echo " -h Display this help message" echo echo "Examples:" echo " $0 -u john -p password123 -r rootpass -c myarch -t Europe/London -d sda" echo " $0 -u jane -p pass456 -r rootpass789 -c janepc -d nvme0n1" exit 0 } # Parse command line arguments while getopts ":u:p:r:c:t:d:h" opt; do case "$opt" in u) USERNAME="$OPTARG" ;; p) USER_PASSWORD="$OPTARG" ;; r) ROOT_PASSWORD="$OPTARG" ;; c) COMPUTER_NAME="$OPTARG" ;; t) TIMEZONE="$OPTARG" ;; d) DISK="$OPTARG" ;; h) help ;; \?) echo "Invalid option: -$OPTARG" >&2; exit 1;; :) echo "Option -$OPTARG requires an argument." >&2; exit 1;; esac done # Append '/dev/' to DISK for internal use FULL_DISK_PATH="/dev/$DISK" # Check and prompt for each required variable [[ -z "$USERNAME" ]] && clear; prompt_variable USERNAME "Enter the non-root username" [[ -z "$USER_PASSWORD" ]] && clear; prompt_variable USER_PASSWORD "Enter the non-root user password" [[ -z "$ROOT_PASSWORD" ]] && clear; prompt_variable ROOT_PASSWORD "Enter the root password" [[ -z "$COMPUTER_NAME" ]] && clear; prompt_variable COMPUTER_NAME "Enter the computer name" [[ -z "$DISK" ]] && clear; prompt_variable DISK "Enter the target disk (e.g., sdX or nvmeXn1)" # Determine disk partition naming convention if [[ "$FULL_DISK_PATH" == *"nvme"* ]]; then DISK="${FULL_DISK_PATH}" DISK1="${FULL_DISK_PATH}p1" DISK2="${FULL_DISK_PATH}p2" DISK3="${FULL_DISK_PATH}p3" else DISK="${FULL_DISK_PATH}" DISK1="${FULL_DISK_PATH}1" DISK2="${FULL_DISK_PATH}2" DISK3="${FULL_DISK_PATH}3" fi # Partition the disk setup_disk() { local part1_size part2_size echo "Partition 1 will be set as GPT and EFI." read -p "Enter partition 1 size or hit enter to use the default value (default: 500M): " part1_size PARTITION1_SIZE=${part1_size:-$PARTITION1_SIZE} echo "Partition 2 will be set as swap." read -p "Enter partition 2 size or hit enter to use the default value (default: 2G): " part2_size PARTITION2_SIZE=${part2_size:-$PARTITION2_SIZE} echo "Enter the number of partitions (minimum 3, default 3):" read -p "Number of partitions: " input_partition_count PARTITION_COUNT=${input_partition_count:-$PARTITION_COUNT} while [[ "$PARTITION_COUNT" -lt 3 ]]; do echo "The minimum number of partitions is 3." read -p "Enter the number of partitions (minimum 3): " PARTITION_COUNT done for ((i=3; i