If else
Shell共有三种三种if…else分支
- if…fi语句
- if…else…fi语句
- if…elif…else…fi语句
1、if…else语句
if [ expression ]
then
Statement(s) to be executed if expression is true
fi
注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。
if…else也可以写成一行,以命令的方式来运行,像这样:
if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi;
2、if条件表达式中的额外判断
字符串的判断
- str1 = str2 两个字符串有相同内容、长度时为真
- str1 != str2
- -n str1 字符串的长度大于0返回真
- -z str1 字符串的长度等于0时返回真
- str1 字符串为非空返回真
比较两个字符串是否相等的时候,一般的做法是:
if [ "$test"x = "test"x ]; then
主要考虑以下几点
- 使用单个等号
- 注意到等号两边各有一个空格:这是unix shell的要求
- 注意到” test"x最后的x,这是特意安排的,因为当 test为空的时候,上面的表达式就变成了x = testx,显然是不相等的。而如果没有这个x,表达式就会报错:[: =: unary operator expected
数字的判断
- int1 -eq int2 两数相等返回真
- int1 -ne int2 两数不相等返回真
- int1 -gt int2 int1大于int2为真
- int1 -ge int2 int1大于等于int2为真
- int1 -lt int2 int1小于int2为真
- int1 -le int2 int1小于等于int2为真
复杂逻辑判断
- -a 与
- -o 或
- ! 非
文件的判断
- -e filename 如果 filename存在,则为真
- -d filename 如果 filename为目录,则为真
- -f filename 如果 filename为常规文件,则为真
- -L filename 如果 filename为符号链接,则为真
- -r filename 如果 filename可读,则为真
- -w filename 如果 filename可写,则为真
- -x filename 如果 filename可执行,则为真
- -s filename 如果文件长度不为0,则为真
判断/home/oicq/script/get_random_shm_key.sh是否存在
if [ -e /home/oicq/script/get_random_shm_key.sh ]
判断文件大小是否为空
if [ ! -s ${REMOTE_FILE} ]
then
SH_error_msg "${REMOTE_FILE} file is empty"
return 1
fi
循环
For
for循环的一般格式为:
for 变量 in 列表
do
command1
command2
...
commandN
done
列表 是一组值(数字,字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个赋给变量。
in 列表是可选的,如果不用它,for 循环使用命令行的位置参数
- 顺序输出当前列表中的数字
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
运行结果如下:
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
- 1到100输出
for i in {
1..100}
do
echo $i
done
- 显示主目录下以.bash开头的文件
#!/bin/bash
for FILE in $HOME/.bash*
do
echo $FILE
done
运行结果如下:
/root/.bash_history
/root/.bash_logout
/root/.bash_profile
/root/.bashrc
while
while循环的一般格式为:
while 条件语句
do
action
done;
示例:从文件中读取内容
while read line;do
echo $line;
done < /etc/hosts;
替换
1、命令替换
命令替换$(cmd)
以及`cmd`
$ ls
a b c
$ echo $(ls)
a b c
$ echo `ls`
a b c
对于echo $(ls)
,shell执行时会先执行$(ls)
,得到其标准输出,在用得到输出替换原来位置上的$(ls)
,再执行echo命令。
注意:$(cmd)
中的命令的错误输出是不会被替换的,只有标准输出
$ var=$(cat d)
cat: d
这里由于文件d在当前目录不存在
2、一串命令的执行()和{}
()
和{}
都是对一串的命令进行执行,但是有所区别:
()
只是对一串命令重新开一个子shell进行执行{}
对一串命令在当前shell执行()
和{}
都是把一串的命令放在括号里面,并且命令之间用;号隔开()
最后一个命令可以不用分号{}
最后一个命令要用分号{}
的第一个命令和左括号之间必须要有一个空格()
里的各命令不必和括号有空格()
和{}
中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令
$ var=test
$ (var=notest; echo $var) ###变量var值为notest,此是在子shell中有效
notest
$ echo $var ###父shell中值仍为test
test
$ { var=notest; echo $var;} ###注意左括号和var之间要有一个空格
notest
$ echo $var ###父shell中的var变量的值变为了notest
notest
$ { var1=test1;var2=test2;echo $var1>a;echo $var2;} ###输出test1被重定向到文件a中,
test2 ###而test2输出则仍输出到标准输出中。
$ cat a
test1
$ { var1=test1;var2=test2;echo $var1;echo $var2;}>a ###括号内命令的标准输出全部被重定向到文件a中
$ cat a
test1
test2
变量
1、shell中 0, 1等变量
- $$:shell本身的PID
- $?:shell最后运行的命令的结束代码
- $*:所有参数列表,如果使用”“括起来的话,会以” 1 2 …$n”形式输出
- $@:所有参数列表,如果使用”“括起来的话,会以” 1”“ 2” … “$n”形式输出**
- $#:添加到shell的参数个数
- $0:shell本身文件名
- 1 n:添加到shell的各个参数值
∗和 @在不加引号的时候,都可以表示一个参数数组;而在加了引号之后,” ∗"就表示一个参数字符串,而" @”依然表示一个参数数组
${var%pattern},表示从变量$var的结尾删除最短匹配pattern的子串
${0%/*}
表示删除从变量 0尾