shell语法特点
- shell是弱类型语言,值都当成字符串处理,算术运算需要使用特殊的语法
- if语句:只要if后的命令执行成功($?=0),即为true
- shell按行或者分号(;)来表示命令的结束
- echo $a 与 echo "$a"效果不同,如果显示字符串的值使用 echo “$a”
变量
- 全局变量:在shell中定义的变量默认是全局变量,在当前shell中任何地方使用的变量。
- 局部变量:在变量名前加local关键字,只能在函数内使用的变量
- 环境变量:在变量名前加export关键字,可以在其子shell中使用的变量。环境变量只能向下传递,即父shell可以传递给子shell
- 变量命名:由英文字母、下划线和数字组成,且首字母不能是数字
a="global"
local b="local"
export c="env"
unset <变量名>
NAME=$ID
NAME=AcTarjan
NAME=hello world
NAME="$ID world"
NAME="hello world"
NAME='$ID world'
NAME=`pwd`
特殊变量
变量 | 含义 |
---|
$? | 上个命令的返回值 |
$0 | 当前函数或脚本名 |
$# | 传递给脚本或函数的所有参数参数的个数 |
$n(n>0) | 脚本或函数的第n个参数 |
$* | 传递给脚本或函数的所有参数 |
$@ | 传递给脚本或函数的所有参数 |
$$ | 当前shell的pid |
正则表达式
符号 | 含义 |
---|
. | 除换行符外的任一字符 |
[] | 匹配括号内的字符 |
[^] | 匹配除括号内的字符外 |
{n} | 匹配前面的字符n次 |
{,n} | 匹配前面的字符最多n次 |
{n,} | 匹配前面的字符至少n次 |
{n,m} | 匹配前面的字符至少n次,最多m次 |
? | 匹配0次或1次,等价于{0,1} |
+ | 至少匹配1次,等价于{1,} |
* | 匹配0次或无数次,等价于{0,} |
^ | 表示行首 |
$ | 表示行尾 |
() | 分组,([a-z]-[0-9])+表示匹配"字母-数字"至少1次 |
| | 或,例如:a|b 表示匹配a或b |
\ | 转义字符 |
字符串比较
- 常用test、[ ]和[[ ]],提供了与或非:!(非) > -a(and 与) > -o(or或)
- [[ ]]功能更强大,支持正则表达式
- test与[ ]效果和用法相同,都是shell的内置命令(builtin)
- '[‘后的空格与’]'前的空格不可省略
test -z "$aa"
test -n "$aa"
test "$aa" = 'abc'
test "$aa" == 'abc'
test "$aa" != 'abc'
test "$aa" < 'abc'
[ "$aa" != 'abc' ]
[[ "$FILENAME" =~ ^test.*zip$ ]]
算术运算
- let与双括号均不支持浮点数运算
- expr命令仅用于计算表达式(不支持浮点数和括号),不能用于赋值。表达式的运算符、操作数之间要有空格,特殊运算符(*,>,<,)要转义
expr a = 1 \* 2
expr $a \* 2
expr 2 \> 1
let a+=b
let a=1+2*(1+1)
let 2==1+1
(( a =1+2*(1+1) ))
(( 2 == 1+1 ))
[ $a -eq $b ]
[ $a -ne $b ]
[ $a -gt $b ]
[ $a -ge $b ]
[ $a -lt $b ]
[ $a -le $b ]
文件判断
- linux中一切皆文件,这里的文件包括目录,特殊文件等
[[ ! -d <文件名> ]]
test -e <文件名>
test -r <文件名>
test -w <文件名>
test -x <文件名>
test -h <文件名>
test -s <文件名>
test -S <文件名>
test -f <文件名>
test -d <文件名>
test -c <文件名>
test -b <文件名>
流程控制
if条件语句
if 条件语句1
then
语句
elif 条件语句2;then
语句
else
语句
fi
case选择语句
case 值 in
模式1)
语句
;;
模式2)
语句
;;
esac
for循环语句
for((i=0; i<100; i++))
do
语句
done
for file in $list
do
echo $file
done
while循环语句
while 条件语句
do
语句
done