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位小数。