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

 

posted @ 2021-02-04 23:42  凡人半睁眼  阅读(398)  评论(0编辑  收藏  举报