转义 + 引用
- 特殊字符
- 一个字符不仅有字面意义,还有元意(meta-meaning)
- 如
# ; \ " '
- 转义
\n \r \t
\$ \" \\
- 引用
"
:不完全引用,解析里面的变量'
:完全引用,不做任何解析- `:运行命令
1 | [root@localhost ~]# echo "$a" |
1 | [root@localhost ~]# var1=123 |
运算符
- 赋值运算符
- =赋值运算符,用于算数赋值和字符串赋值
- 使用unset取消为变量的赋值
- =还可以作为测试运算符
- 算术运算符
+ - * / ** %
- 使用expr进行运算,
expr 4 + 5
,只支持整数
- 数字常量
let "变量名=变量值"
- 变量值使用0开头为八进制
- 变量值使用0x开头为十六进制
- 双圆括号(let命令的简化)
(( a=10 ))
(( a++ ))
echo $(( 10+20 ))
1 | [root@localhost ~]# expr 4 + 5 |
1 | [root@localhost ~]# (( a=4+5 )) |
特殊字符
引号
'
:完全引用"
:不完全引用- `:执行命令
括号
- 圆括号:
()
、(())
、$()
- 单独使用圆括号会产生一个子Shell
(xyz=123)
- 数组初始化
IPS=(ip1 ip2 ip3)
- 数字常量:
(())
(let命令的简写) - 运行指令:
$()
- 单独使用圆括号会产生一个子Shell
- 方括号:
[]
(test命令的简写)、[[]]
- 单独使用方括号是测试(test)或数组元素功能
- 两个方括号表示测试表达式
- 尖括号:
< >
- 比较符号
- 重定向符号
- 花括号:
{}
- 输出范围:
echo {0..9}
- 文件复制:
cp /etc/passwd{,.bak}
- 输出范围:
1 | # 产生一个子Shell |
1 | [root@localhost ~]# [ 5 -gt 4 ] |
1 | [root@localhost ~]# echo {0..9} |
运算符号和逻辑符号
- 算术运算符:
+ - * / %
- 比较运算符:
> < =
- 逻辑运算符:
&& || !
1 | [root@localhost ~]# (( 5 > 4 )) |
转义符号
- 普通字符 -> 具有不同的功能:
\n
- 特殊字符 -> 当做普通字符:
\'
其它符号
#
:注释符;
:命令分隔符- case语句的分隔符要转义
;;
- case语句的分隔符要转义
:
:空命令.
和source
命令相同~
:家目录-
:上一次访问的目录,
:分隔目录*
:通配符?
:条件测试或通配符$
:取值符号|
:管道符&
:后台运行_
:空格
1 | [root@localhost ~]# ifdown ens33 ; ifup ens33 |
1 | [root@localhost ~]# grep -A10 case /etc/bashrc | head -n 10 |
1 | # 永远为true,常用于死循环的占位符 |
1 | [root@localhost ~]# cd /tmp/ |
1 | [root@localhost tmp]# echo {0..9} |
测试
退出
- exit 10返回10给Shell,返回值非0表示不正常退出
$?
:判断当前Shell前一个进程是否正常退出
1 | [root@localhost ~]# cat 8.sh |
test
- test命令用于检查文件或者比较值
- test可以做以下测试
- 文件测试
- 整数比较测试
- 字符串测试
- test命令可以简化为
[]
[]
的扩展写法是[[]]
,支持&& || < >
1 | $ man test |
1 | [root@localhost ~]# test -f /etc/passwd |
判断 + 分支
if-then
1 | [root@localhost ~]# [ $UID = 0 ] |
if-then-else
1 | [root@localhost ~]# cat 9.sh |
if-elif-else
1 | [root@localhost ~]# cat 10.sh |
嵌套if
1 | [root@localhost ~]# cat 11.sh |
case
1 | [root@localhost ~]# cat 12.sh |
循环
for
- 遍历命令的执行结果
- 使用反引号或
$()
执行命令,命令的结果当做列表进行处理
- 使用反引号或
- 遍历变量和文件内容
- 列表中包含多个变量,变量用空格分隔
- 对文本处理,要用文本查看命令取出文本内容
- 默认逐行处理,如果文本出现空格会当做多行处理
- C语言风格(常用于awk)
- Shell不擅长做数值计算
1 | [root@localhost ~]# echo {1..9} |
1 | [root@localhost ~]# touch a.mp3 b.mp3 c.mp3 |
1 | [root@localhost ~]# for (( i=1; i<=10; i++ )) |
while + until
1 | [root@localhost ~]# a=1 |
1 | # 死循环 |
1 | [root@localhost ~]# until :; do echo `date`; done |
位置参数
$0
:脚本名称$1...${10}
:具体的位置参数$*
、$@
:所有的位置参数$#
:位置参数的数量
1 | [root@localhost ~]# cat 13.sh |
1 | [root@localhost ~]# cat 13.sh |
函数
自定义函数
1 | [root@localhost ~]# function cdls() { |
1 | [root@localhost tmp]# cdls() { |
local变量是在函数作用范围内的变量,为了避免函数内外同名变量的影响
1 | [root@localhost ~]# cat 14.sh |
系统脚本
/etc/init.d/functions
1 | [root@localhost ~]# grep -A9 'echo_success()' /etc/init.d/functions |
/etc/profile
1 | [root@localhost ~]# grep -A10 'pathmunge ()' /etc/profile |
~/.bash_profile
-> ~/.bashrc
1 | [root@localhost ~]# cat ~/.bash_profile |
~/.bashrc
-> /etc/bashrc
1 | [root@localhost ~]# cat ~/.bashrc |