shell之shift、test、printf
1、Shift的用法 (参数左移)
位置参数可以用
shift
命令左移。如
shift 3:
表示将$1
、$2
、$3
丢弃,$4
现在变成$1
,$5
现在变成$2
,$0
不移动。不带参数的shift,默认左移
1
。对于位置变量或命令行参数,其个数必须是确定的,或者当 Shell 程序不知道其个数时,可以把所有参数一起赋值给变量$*。若用户要求 Shell 在不知道位置变量个数的情况下,还能逐个的把参数一一处理,也就是在 $1 后为 $2,在 $2 后面为 $3 等。在 shift 命令执行前变量 $1 的值在 shift 命令执行后就不可用了。
#!/bin/bash until [ $# -eq 0 ] #unti 循环和 while 循环恰好相反,当判断条件不成立时才进行循环,一旦判断条件成立,就终止循环。 do echo "第一个参数为: $1 参数个数为: $#" shift #默认为 1 done
执行结果
$ bash shift.sh 12 32 4 5 2 1 第一个参数为: 12 参数个数为: 6 第一个参数为: 32 参数个数为: 5 第一个参数为: 4 参数个数为: 4 第一个参数为: 5 参数个数为: 3 第一个参数为: 2 参数个数为: 2 第一个参数为: 1 参数个数为: 1
2、test判断条件是否成立
用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
数值测试
$ cat test.sh #!/bin/bash num1=100 num2=100 if test $[num1] -eq $[num2] then echo '两个数相等!' else echo '两个数不相等!' fi
$ bash test.sh 两个数相等!
代码中的 [] 执行基本的算数运算,如:
$ echo "$[3*3]" 9
# 注意等号两边不能有空格
字符串测试
文件测试
$ cat test.sh #!/bin/bash cd /bin if test -e ./bash then echo '文件已存在!' else echo '文件不存在!' fi
$ bash test.sh 文件已存在!
另外,Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。例如:
cd /bin if test -e ./notFile -o -e ./bash then echo '至少有一个文件存在!' else echo '两个文件都不存在' fi 至少有一个文件存在!
3、printf用例
printf 命令模仿 C 程序库(library)里的 printf() 程序。由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
$ echo "Hello, Shell" Hello, Shell $ printf "Hello, Shell\n" Hello, Shell
脚本用例
#!/bin/bash printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
$ bash tizhong.sh
姓名 性别 体重kg 郭靖 男 66.12 杨过 男 48.65 郭芙 女 47.99
%s %c %d %f 都是格式替代符:
%s 输出一个字符串;
%d 整型输出;
%c 字符输出;
%f 浮点数。
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留2位小数。