# switch
case "${FOO}" in
abc)
bar=123
;;
*efg*|*hij*)
bar=567
;;
*)
SYSADMIN=pko
;;
esac
# while
while true
do
echo .
sleep 10
done
# and
if [ "$foo" == "a" ] && [ "$bar" == "b" ]; then
# or
if [ "$foo" == "x" ] || [ "$bar" == "y" ]; then
# both
if ( [ "$a" == "a" ] || [ "$a" == "b" ] ) && ( [ "$b" == "c" ] ); then
# enable color output systemwide for ls and grep
cat <> /etc/profile.d/alias.sh
alias ls='ls --color=auto'
alias grep='grep --color=auto'
EOF
# get exitcode prevoius command
${PIPESTATUS[0]}
# redirect stdout AND stderr to file
COMMAND &> file.out
# sequence
echo {,my-}host{1,{3..5},9,10}
echo $(seq 1 4)
# random
$(((RANDOM%10)+1))
# for loop
START=1
END=10
for ((i=START; i<=END; i++)); do
echo "i: $i"
done
# String regexp
if [[ "${MOTHERBOARD}" =~ H8DM(8|E)-2 ]] && [[ "${RAID}" =~ 9650SE-(4|8)LPML ]]; then
echo "found"
fi
if [[ "$STR" =~ .*"$SUB".* ]]; then
echo "It's there."
fi
# negate
if [[ ! $PATH =~ $temp ]]
# replace commas with spaces
${foo//,/ }
# remove non digit
echo "${MY_VAR//[!0-9]/}"
# endless loop
while true; do
YOUR_COMMAND
done
# read from standard input
IN=$(cat /dev/stdin); echo $IN
# process specified files in directory
for i in *.$1
do
echo "$i" "${i%$1}$2"
done
# ping all clients
NET=192.168.1
for i in {1..254}; do
ping -w 1 -c 1 ${NET}.$i > /dev/null
if [ $? -eq 0 ]; then
echo ${NET}.$i
fi
done
# parameter expansion
echo ${variable:-default_value}
#
# shell variables
#
# internal field separator
IFS=$(echo -en "\n\b")
567
# get calling (parent) script name
CALLING_SCRIPT=$(ps -o command= $PPID)
SCRIPT=${CALLING_SCRIPT##*/}
# ssh interactive login
ssh foo@www.example.com -t "bash -ic 'bar -vvv'"
# uppercase
x=bar
echo ${x^}
Bar
echo ${x^^}
BAR
# lowecase
x=BAR
echo ${x,}
bAR
echo ${x,,}
bar
VAR_3="Reverse Cases"
echo ${VAR_3~}
echo ${VAR_3~~}
# remote SSH command with wildcard
ssh ${SERVER_IP} sudo 'bash -c "ls -l /etc/*"'
# unset all variables with OS_ prefix
unset ${!OS_@}Variables
$@ - parameter
Shortcuts
https://skorks.com/2009/09/bash-shortcuts-for-maximum-productivity/
test parameter count
if [ "$#" -eq 4 ]; then
BMC_DNS=${1}
BMC_IP=${2}
HOST_DNS=${3}
HOST_IP=${4}
elif [ "$#" -eq 2 ]; then
BMC_DNS=${1}
BMC_IP=$(dig +short ${BMC_DNS})
HOST_DNS=${2}
HOST_IP=$(dig +short ${HOST_DNS})
else
echo "Usage: $0 BMC_DNS HOST_DNS"
exit 1
fi
[ -z "${PROJECT}" ] && PROJECT=testRun command on exit / interrupt
function cleanup {
rm -f /tmp/$$/*.log
rm -d /tmp/$$
}
trap cleanup SIGINTCheck
[ -L ~/bar ] || ln -s ~/foo ~/bar
Customize colors
https://misc.flogisoft.com/bash/tip_colors_and_formatting
# cleanup color
tput init
Customize BASH prompt
https://wiki.archlinux.de/title/Bash-Prompt_anpassen
echo PS1="'"'\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@web1-dev:\w\$'"'" >> .bashrcset
set -a # auto export variables
set -x # debug / show commands
Array
https://linuxconfig.org/how-to-use-arrays-in-bash-script
declare -a DHCP_PING_STATE
NETWORK_PING_STATES+=("${NETWORK_ID} ${NETWORK_NAME} ${ROUTER_PING_STATE} $(echo ${DHCP_PING_STATE[@]})")
for NETWORK_PING_STATE in "${NETWORK_PING_STATES[@]}"; do
echo "${NETWORK_PING_STATE}"
done | column -tSource .bashrc
ssh -t vm1 bash -ic '"pyenv install 3.5.10 -s"'Debug output
DEBUG=1
((${DEBUG})) && echo fooAuto relogin to root
touch ~/.bash_profile
echo "sudo su -" >> ~/.bash_profile
Online BASH script check
https://www.shellcheck.net/
Links
https://devhints.io/bash
http://misc.flogisoft.com/bash/tip_colors_and_formatting - Formatting
https://www.dartmouth.edu/~rc/classes/ksh/special-vars.html
http://wiki.bash-hackers.org/commands/classictest - BASH test commands
http://www.linuxtutorialblog.com/post/tutorial-conditions-in-bash-scripting-if-statements