目录:
- printf 命令
- if...else语句
- case ... esac 语句
- for循环
- while循环
- until 循环
- continue、break
1、printf 命令
printf 命令用于格式化输出, 是echo命令的增强版。它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同,移植性要比 echo 好。
如同 echo 命令,printf 命令也可以输出简单的字符串:
printf "Hello, world\n"
printf 不像 echo 那样会自动换行,必须显式添加换行符(\n)
printf命令的语法:
printf format-string [arguments...]format-string
为格式控制字符串,
arguments `为参数列表。
printf 命令不用加括号
format-string 可以没有引号,但最好加上,单引号双引号均可。
参数多于格式控制符(%)时,format-string 可以重用,可以将所有参数都转换。
arguments 使用空格分隔,不用逗号。
示例:
#双引号
printf "%d -- %s\n" 11 "哈哈"
#单引号和双引号效果一样
printf '%d -- %s\n' 11 "哈哈"
#也可以不写引号
printf %s "哈哈"
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf "%s\n" abc def
printf "%s and %d \n"
# 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
printf "'%s , %d\n'" Hello Shell
输出:
11 -- 哈哈
11 -- 哈哈
哈哈abc
def
and 0
./test.sh: line 11: printf: Shell: invalid number
'Hello , 0
注意,根据POSIX标准,浮点格式%e、%E、%f、%g与%G是“不需要被支持”。这是因为awk支持浮点预算,且有它自己的printf语句。这样Shell程序中需要将浮点数值进行格式化的打印时,可使用小型的awk程序实现。然而,内建于bash、ksh93和zsh中的printf命令都支持浮点格式。
2、if...else语句
if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句:
- if ... fi 语句;
- if ... else ... fi 语句;
- if ... elif ... else ... fi 语句。
if ... else 语句
if ... else
语句的语法:
if [ expression ]
then
Statement(s) to be executed if expression is true
fi
最后必须以fi
来结尾闭合 if,fi
就是 if 倒过来拼写,后面也会遇见。
注意:expression 和方括号([ ])之间必须有空格
,否则会有语法错误。
示例:
a=10
b=20
if [ $a == $b ]
then
echo "a、b相等"
fi
if [ $a != $b ]
then
echo "a、b不相等"
fi
输出
a、b不相等
if ... else ... fi 语句
if ... else ... fi
语句的语法:
if [ expression ]
then
Statement(s) to be executed if expression is true
else
Statement(s) to be executed if expression is not true
fi
示例:
a=10
b=20
if [ $a == $b ]
then
echo "a、b相等"
else
echo "a、b不相等"
fi
输出:
a、b不相等
if ... elif ... fi 语句
if ... elif ... fi
语句可以对多个条件进行判断,语法为:
if [ expression 1 ]
then
Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
Statement(s) to be executed if expression 3 is true
else
Statement(s) to be executed if no expression is true
fi
示例:
a=10
b=20
if [ $a == $b ]
then
echo "a等于b"
elif [ $a -gt $b ]
then
echo "a大于b"
else
echo "a小于b"
fi
输出:
a小于b
if ... else
语句也可以写成一行,如果同一行有多条语句需要分号,以命令的方式来运行:
a=10
b=10
if test $a -eq $b; then echo 'a、b相等!'; fi;
if ... else
语句也经常与test
命令结合使用,如下所示:
a=$[2*3]
b=$[1+5]
if test $a -eq $b
then
echo 'a、b相等!'
else
echo 'a、b不等'
fi;
test
命令用于检查某个条件是否成立,与方括号([ ])类似
3、case ... esac 语句
case ... esac
与其他语言中的 switch ... case
语句类似,是一种多分枝选择结构。
case
语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case
语句格式如下:
case 值 in
模式1)
command1
command2
command3
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac
case
工作方式如上所示。取值后面必须为关键字 in
,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;
。;;
与其他语言中的 break
类似,意思是跳到整个case
语句的最后。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
示例:
#!/bin/sh
echo "请输入数字1~3"
read inputNum
case $inputNum in
1) echo "输入的是1"
;;
2) echo "输入的是2"
;;
3) echo "输入的的3"
;;
*) echo "无效数字"
;;
esac
输出:
请输入数字1~3
2
输入的是2
实例二:
#!/bin/sh
option="${1}"
case ${option} in
-f) FILE="${2}"
echo "File name is $FILE"
;;
-d) DIR="${2}"
echo "Dir name is $DIR"
;;
*)
echo "`basename ${0}`:usage: [-f file] | [-d directory]"
exit 1 # Command to come out of the program with status 1
;;
esac
输出:
Daniels-MacBook-Pro:desktop chenzhichao$ ./test.sh -f fileName
File name is fileName
Daniels-MacBook-Pro:desktop chenzhichao$ ./test.sh -d directoryName
Dir name is directoryName
4、for循环
for循环一般格式为:
for 变量 in 列表
do
command1
command2
...
commandN
done
列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。
in
列表是可选的,如果不用它,for
循环使用命令行的位置参数。
示例一:
for num in 1 2 3 4
do
echo "num is $num"
done
输出
num is 1
num is 2
num is 3
num is 4
示例二:
array=(1 2 3 4 5)
for a in ${array[*]}
do
echo ${a}
done
输出:
1
2
3
4
5
实例三:
#顺序输出字符串中的字符
for c in 'hello world'
do
echo $c
done
输出:
hello world
示例四
#查看当前目录有哪些jpg图片
currentDir=`pwd`
for file in ${currentDir}/*.jpg
do
echo $file
done
输出:
/Users/chenzhichao/desktop/11.jpg
五、while循环
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while command
do
Statement(s) to be executed if command is true
done
示例:
num=5
while [ $num -gt 0 ]
do
echo $num
num=`expr $num - 1`
done
输出:
5
4
3
2
1
实例二:
echo "同时按ctrl+D结束"
echo "输入信息:"
while read message
do
echo "信息:$message"
done
输出:
同时按ctrl+D结束
输入信息:
你好啊,**
信息:你好啊,**
六、until 循环
until
循环执行一系列命令直至条件为true
时停止。until
循环与 while
循环在处理方式上刚好相反。一般while
循环优于until
循环,但在某些时候,也只是极少数情况下,until
循环更加有用。
until
循环格式为:
until command
do
Statement(s) to be executed until command is true
done
command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
示例:
#!/bin/sh
a=0
until [ ! $a -lt 5 ]
do
echo $a
a=`expr $a + 1`
done
输出:
0
1
2
3
4
七、continue、break
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 break
和 continue
来跳出循环。
break命令
break
命令允许跳出所有循环(终止执行后面的所有循环)。
示例:
echo "输入数字1~5,输入其他数字不做处理"
while read num
do
if [ $num -gt 0 -a $num -lt 6 ]
then
echo "输入的是$num"
else
echo "无效字符,退出"
break
fi
done
输出:
输入数字1~5,输入其他数字不做处理
1
输入的是1
5
输入的是5
6
无效字符,退出
在嵌套循环中,break
命令后面还可以跟一个整数,表示跳出第几层循环。例如:
break n
表示跳出第 n 层循环
示例
for var1 in 1 2 3
do
for var2 in 0 5
do
if [ $var1 -eq 2 -a $var2 -eq 0 ]
then
break 2
else
echo "$var1 $var2"
fi
done
done
输出:
1 0
1 5
continue命令
continue
命令与break
命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
示例:
for num in 1 2 3 4 5
do
if [ $num == 3 ]
then
continue
fi
echo "num is $num"
done
输出:
num is 1
num is 2
num is 4
num is 5