# shortcuts alt-backspace # delete left word ctrl-t # swap last two chars, readline emacs mode alt + . # cylcle through last arguments # special parameters $? # last exit code $! # pid of last background proc !! # last/previous command !$ # first of last arguments !* # all last arguments ~- # previous directory # history !! # execute last command in history ^foo^bar # execute last command after replacing foo w/ bar !abc # execute last command in history beginning w/ 'abc' !abc:p # print last command in history beginning w/ 'abc' ctrl-r # search in history ctrl-g # exit history search # redirection connect stdout or stdout and stderr of `command1` to stdin of `command2` with command1 | command2 command1 |& command2 # shorthand for: command1 2>&1 | command2 predefined 0 `stdin`, 1 `stdout`, 2 `stderr`. command 2>/dev/null command 1>&2 command >/dev/null 2>&1 `>` overwrites while `>>` appends to file. *process substitution* puts output in named fifo which can be used like a file by other process: `cat <( echo hello )`. doesn't work w/ `source` before bash 3.2, workaround: `. /dev/stdin <<<"$( echo 'PS1=yep' )"`. # path expansion additional to globbing there's extended globbing (`shopt extglob`). # match all files w/o `.` in their filenames ls +([^.]) # parameter expansion ## remove matching pre/suffix ${a#pattern} # prefix ${a##pattern} # greedy ${a%pattern} # suffix ## case modification ${a,,pattern} # lowercase all chars in `$a` that match pattern ${a,,} # same as `${a,,?}` ${a,pattern} # lowercase only first matching char ${a^pattern} # uppercase # variables By convention, environment variables (`PAGER`, `EDITOR`, ...) and internal shell variables (`SHELL`, `BASH_VERSION`, ...) are capitalized. All other variable names should be lower case. *If it's your variable, lowercase it. If you export it, uppercase it.* # builtins ```sh help [name] command -v # like `which` w/o error message type [name] # display information about command type, includes function body declare -F [name] # display declared function names declare -f [name] # display declared function including body read var # read one line from stdin into `var` typeset # (deprecated?) synonym for `declare` ``` # includes `.` is the Bourne and POSIX shell command while `source` is the C-Shell command. # unsorted dollar sign before string triggers special char evaluation, f.e.: `$'\n'` create sequence w/ `{3..9}` figure out running shell session: ``` [[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive' [[ -o login ]] && echo 'Login shell' || echo 'Not login shell' ``` ## function return value w/ `declare` [0] $ function marius () { declare -n var=$1; var='xxx'; } 16:05:07 heiko@bonn:~ [0] $ msg= 16:05:19 heiko@bonn:~ [0] $ marius msg 16:05:28 heiko@bonn:~ [0] $ echo $msg xxx