#!/bin/bash # Create a keyboard file in /tmp to test the script conf_print_keyboard_tmp() { cat <<-EOF # KEYBOARD CONFIGURATION FILE # Consult the keyboard(5) manual page. XKBMODEL="pc104" XKBLAYOUT="gb" XKBVARIANT="" XKBOPTIONS="" BACKSPACE="guess" EOF } #conf_print_keyboard_tmp | tee /tmp/keyboard # Default destination directory if not provided DEST=${1:-/etc/skel} # Create the.xinitrc.d directory if it doesn't exist mkdir -p ${DEST}/.xinitrc.d # Write the setxkbmap configuration to a script file cat </dev/null #!/bin/bash setxkbmap -model pc104 -layout gb,us -option caps:swapecape EOF # Make the script executable chmod +x ${DEST}/.xinitrc.d/setxkbmap.sh # Keyboard configuration adjustments config_file="/etc/default/keyboard" # config_file="/tmp/keyboard" cp $config_file $config_file-bak declare -A rules rules=( "XKBMODEL" "pc104" "XKBLAYOUT" "gb" "XKBVARIANT" "" "XKBOPTIONS" "caps:swapescape" "BACKSPACE" "guess" ) echo "" declare -p rules echo "" # Iterate through the keys of the associative array for key in "${!rules[@]}"; do # Access the value associated with the current key value="${rules[$key]}" # Now you can use both $key and $value inside this loop echo "$key = $value" done echo "" for rule in "${!rules[@]}"; do value="${rules[$rule]}" regex="s|^#.\?\(${rule}\s*\).*$|\1=${value}|" # sudo sed -i "${regex}" ${config_file} if [[ -n "$value" ]]; then echo "sudo sed -i "${regex}" ${config_file}" sudo sed -i "${regex}" ${config_file} fi done echo "" cat ${config_file} # Trigger udevadm to apply changes sudo udevadm trigger --subsystem-match=input --action=change