Bash
Our beloved shell, we use and abuse it every day. There are several general tips which will help you to work with without accidentally jeopardizing your box.
sh cheatsheet
Control Operators: & && ( ) ; ;; | || <newline> Redirection Operators: < > >| << >> <& >& <<- <> Reserved Words: ! elif fi while case else for then { } do done until if esac Quoting: " ' \ Special Parameters: * @ # ? - $ ! 0 Grouping Commands Together: {} () { printf " hello " ; printf " world\n" ; } > greeting Functions: name () command local [varialbe | -] ... Word Expansions: 1. Tilde Expansion, Parameter Expansion, Command Substitution, Arithmetic Expansion (these all occur at the same time). 2. Field Splitting is performed on fields generated by step (1) unless the IFS variable is null. 3. Pathname Expansion (unless set -f is in effect). 4. Quote Removal. The $ character is used to introduce parameter expansion, command substitution, or arithmetic evaluation. Parameter Expansion: ${expression} ${parameter} ${parameter:-word} ${parameter:=word} ${parameter:?[word]} ${parameter:+word} ${#parameter} ${parameter%word} ${parameter%%word} ${parameter#word} ${parameter##word} Command Substitution: $(command) `command` Arithmetic Expansion $((expression)): White Space Splitting (Field Splitting): IFS Pathname Expansion (File Name Generation): Each word is viewed as a series of patterns, separated by slashes. Shell Patterns: Meta-characters are “!”, “*”, “?”, and “[”. Builtins: : true . file alias bd command cd - cd -LP echo eval exec exit export export -p fc fg getopts hash pwd read readonly readonly -p printf set shift test times trap type ulimit umask unalias unser wait Environment: HOME PATH CDPATH MAIL MAILCHECK MAILPATH PS1 PS2 PS4 IFS TERM HISTSIZE PWD OLDPWD PPID Files: $HOME/.profile /etc/profile
General tips
# Think before you type # When rebooting, stop and say to yourself "I'm going to reboot the server foo, # I mailed everyone interested so it's okay, now I'll press enter and pray!" reboot # Before doing anything potentially harmful, stop and say to yourself "I'm going to # delete dir /foo/bar, it's okay because it contains old unnecessary files, # I'm sure of it." rm -rvf /foo/bar # still wrong because of next tip # Always do ls -R /foo/bar before deleting, chmodding, moving # or doing anything potentially harmful! ls -R /foo/bar rm -rvf /foo/bar # now it's ok # Always use -v key ln -v mv -v chmod -v cp -v # Always specify full path rm -rf /full/path/to/dir chmod -R foo:bar /full/path/to/dir <...> # Don't do this EVAR! rm -rf .* # bad bad bad thing will happen to you! chmod -R foo:bar .*
Usefull snippets and bash quirks
# Getting list of files # Don't do this, brakes on spaces for path in `find`; do stuff with "$path" # too late - already broken on whitespace done # Do this, it's safe find | while read path; do stuff with "$path" done # Copy binary file using bash builtins ONLY ( while read -r -d '' ; do printf %s'\0' "${REPLY}" ; done ; printf %s "${REPLY}" ) < /bin/ls > /tmp/ls # Doing something in loop while true ; do stuff ; done # Doing something in loop iterating through ranges for ((i=1;i<=255;++i)); do host 10.0.0.$i; done # Using bash as a calculator echo $((10*1024**3)) # readable format echo $(/bin/date +%d-%m-%Y) 31-05-2012 # good format for archive directory naming, by default sorts first-to-last echo $(/bin/date +%Y%m%d) 20120531 # control teh cursor! tput cup 10 10 # get input from user read name < /dev/tty # conditions http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html # xtrace (debugging) bash -x