aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/bash.md
diff options
context:
space:
mode:
authorjohannst <johannes.stoelp@gmail.com>2020-04-11 19:28:57 +0200
committerjohannst <johannes.stoelp@gmail.com>2020-04-11 19:28:57 +0200
commitf81b1f23a526450e16992e2e248495365d9e394d (patch)
treede07161fa4b299c2e1b62f6f71702769f2768ee7 /src/bash.md
parentcb747f51cbe63e1302192eaf029ebdd4f1e154c0 (diff)
downloadnotes-f81b1f23a526450e16992e2e248495365d9e394d.tar.gz
notes-f81b1f23a526450e16992e2e248495365d9e394d.zip
bash add expansion + completion notes
Diffstat (limited to 'src/bash.md')
-rw-r--r--src/bash.md91
1 files changed, 89 insertions, 2 deletions
diff --git a/src/bash.md b/src/bash.md
index 0028724..1dd35a8 100644
--- a/src/bash.md
+++ b/src/bash.md
@@ -17,10 +17,59 @@
### Parameter
```bash
# default param
-# if $foo set, then bar=$foo else bar=some_val
-bar=${foo:-some_val}
+bar=${foo:-some_val} # if $foo set, then bar=$foo else bar=some_val
+
+# check param set
+bar=${foo:?msg} # if $foo set, then bar=$foo else exit and print msg
+
+# indirect
+FOO=foo
+BAR=FOO
+bar=${!BAR} # deref value of BAR -> bar=$FOO
+
+# prefix
+${foo#prefix} # remove prefix when expanding $foo
+# suffix
+${foo%suffix} # remove suffix when expanding $foo
+
+# substitute
+${foo/pattern/string} # replace pattern with string when expanding foo
+# pattern starts with
+# '/' replace all occurences of pattern
+# '#' pattern match at beginning
+# '%' pattern match at end
+```
+
+> Note: `prefix`/`suffix`/`pattern` are expanded as [pathnames](#pathname).
+
+### Pathname
+
+```bash
+* match any string
+? match any single char
+\\ match backslash
+[abc] match any char of 'a' 'b' 'c'
+[a-z] match any char between 'a' - 'z'
+[^ab] negate, match all not 'a' 'b'
+[:class:] match any char in class, available:
+ alnum,alpha,ascii,blank,cntrl,digit,graph,lower,
+ print,punct,space,upper,word,xdigit
```
+Wit `extglob` shell option enabled it is possible to have more powerful
+patterns. In the following `pattern-list` is one ore more patterns separated
+by `|` char.
+
+```bash
+?(pattern-list) matches zero or one occurrence of the given patterns
+*(pattern-list) matches zero or more occurrences of the given patterns
++(pattern-list) matches one or more occurrences of the given patterns
+@(pattern-list) matches one of the given patterns
+!(pattern-list) matches anything except one of the given patterns
+```
+> Note: `shopt -s extglob`/`shopt -u extglob` to enable/disable `extglob`
+> option.
+
## I/O redirection
> Note: The trick with bash I/O redirection is to interpret from left-to-right.
@@ -49,4 +98,42 @@ command 2>&1 >file
1. duplicate `fd 1` to `fd 2`, effectively redirecting `stderr` to `stdout`
2. redirect `stdout` to `file`
+## Completion
+
+The `complete` builtin is used to interact with the completion system.
+```bash
+complete # print currently installed completion handler
+complete -F <func> <cmd> # install <func> as completion handler for <cmd>
+complete -r <cmd> # uninstall completion handler for <cmd>
+```
+
+Variables available in completion functions:
+```bash
+# in
+$1 # <cmd>
+$2 # current word
+$3 # privous word
+
+COMP_WORDS # array with current command line words
+COMP_CWORD # index into COMP_WORDS with current cursor position
+
+# out
+COMPREPLY # array with possible completions
+```
+
+`compgen` builtin is used to generate possible matches for `word` out of possible `option`s.
+The syntax is as follows:
+```bash
+compgen [option] [word]
+
+# usefule options:
+
+# -W <list> compare against word-list
+compgen -W "foo foobar bar" "f"
+
+# -d compare against dir names
+# -f compare against file names
+compgen -d -f "hom"
+```
+
[dup2]: http://man7.org/linux/man-pages/man2/dup.2.html