一些小的知识点:
- ‘(‘,’)’ 是元字符, ‘{‘,’}’ 是保留字,所以圆括号两边可以没有空格,而花括号两边必须有空格
- ((expression)) 是一个算数表达式; [[ expression ]] 是一个条件表达式
- &>word 和 >&word 都等价于 >word 2>&1 ; 推 荐 使 用 第 一 种
- 将 字 符 放 在 单 引 号 之 中 , 将 保 留 引 用 中 所 有 字 符 的 字 面 意 义 。 单 引 号 不 能 包 含 在 单 引 号 引 用 之 中 , 即 使 前 面 加 上 了 反 斜 杠
- 将 字 符 放 在 双 引 号 中 , 同 样 保 留 所 有 字 符 的 字 面 意 义 , 例 外 的 情 况 是 $, ‘, 和\。 字 符 $ 和 ‘ 在 双 引 号 中 仍 然 具 有 特 殊 意 义 。 反 斜 杠 只 有 后 面 是 下 列 字 符 时 才 有 特 殊 意 义 : $, ‘, “, \, 或 <newline>. 双 引 号 可 以 包 含 在 双 引 号 引 用 中 , 但 要 在 前 面 加 上 一 个 反 斜 杠
- 双 引 号 引 用 字 符 串 前 面 加 上 一 个 $ 符 号 将 使 得 这 个 字 符 串 被 根 据 当 前 语 言 环 境 (locale) 来 翻 译
- getopts 是一个内建命令
练习:
for (( expr1 ; expr2 ; expr3 )) ; do list ; done
1 2 3 4 |
$ for((i=0; i<3;i++))do echo $i;done 0 1 2 |
for name [ in word ] ; do list ; done
1 2 3 4 |
$ for i in {1..3};do echo $i; done 1 2 3 |
select name [ in word ] ; do list ; done
1 2 3 4 5 6 7 |
$ select m in "menu1" "menu2";do if [[ $m == "menu1" ]] ; then echo "you are right"; break;else echo "please retry";fi; done 1) menu1 2) menu2 #? 2 please retry #? 1 you are right |
case word in [ [(] pattern [ | pattern ] … ) list ;; ] … esac
1 2 |
$ case a in (a | b) echo ok;; esac ok |
圆括号的用法
- 子shell:
1( cd ~; ls )
命令在子shell中执行,不影响当前shell环境,当前shell的当前环境不发生变化 - 子shell求值
1files=$(ls)
ls 的结果赋值给files变量 - 算术表达式
1((i++))
注意: 不能写作: (($i++)),因为如果i=1,替换之后为((1++)) ,显然没法运算,但是:
12j=$((i+1)) #等同于j=$(($i+1)) - 数组
1arr=( $(ls) )
arr是个数组,包含当前目录下面的所有文件名
1str=$(ls)
str 是个字符串
1arr=(ls)
arr是一个包含字符串ls的数组 - 字符串替换
注意: 该特性在 GNU bash,版本 4.4.19(1)-release (x86_64-pc-linux-gnu) 上测试通过,在 GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu) 上测试不通过