====== Bash ====== ===== re-run as other user ===== if [ $UID == 0 ]; then exec su -c "$0" john fi ===== Check if command is installed ===== if ! command -v "${TOOL}" &>/dev/null; then echo " Command ${TOOL} not found. Please install it" exit 1 fi and use it inside loop: for tool in awk bc sed; do .... done ===== Output ===== DEBUG() { if [ $DEBUG_ENABLE -eq 1 ]; then >&2 echo "DBG: $@" fi } ===== Variables with space ===== # Treat arguments as parts of one argument declare DST=$* # Use double colons to pass argument with spaces nice ionice -c idle btrfs filesystem defragment -v -r -czlib "${DST}" Quote problematic characters to use in shell invocation: QUOTED_VAR="${VAR@Q}" ===== Default values ===== ${parameter:-word} If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted. FOO=${VARIABLE:-default} Or, which will assign to VARIABLE as well: FOO=${VARIABLE:=default} ===== reading in loop without subshell ===== var=0 while read file do echo $file; var=1 done < <(ls -1 /tmp/) ==== 'read' insid loop ==== In loop where stdin is redirected the easiest way to use read is: TTY=`tty` while read ... do read CTRLC < ${TTY} done < somedata ===== concatenate output (subshell) ===== ( command1 ; command2 ; command3 ) | cat { command1 ; command2 ; command3 ; } > outfile.txt ===== leading zeros / octal ===== To interpret a number as decimal, use 10#n form, eg. 10#09 VAR=077; echo $(($VAR+1)) # 64 # specify base method VAR=077; echo $((10#$VAR+1)) # 78 # strip leading zeros method VAR=077; VAR=${VAR#0}; echo $(($VAR+1)) # 78 ===== double brackets [[ ]] ===== [[http://tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS|DBLBRACKETS]] Bash double brackets [[ ]] (extended test command) are safer and provides more features but they are not portable (and not sh compatible). Features: - not filename expansion. Strings will be take literally (i.e. "name*"). - operators like || instead of -o - regex matching =~ [[ -e $file_name ]] [ -e "$file_name" ] ===== Check if string contains another string ===== not compatible with sh if [[ $string == *"word1 word2"* ]] ... if [[ $string =~ .*word.* ]] ... ==== Execute command until fail ==== while command; do :; done