shell中的传递参数$0 / $n、shell运算符(算术/关系/布尔/字符串/文件测试)、echo 命令输出字符串、printf 命令输出格式化的字符串、test 命令检查某条件是否成立

一、传递参数

1、在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n

  n 代表一个数字,0 为执行的文件名,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推

#以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):

#!/bin/bash
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

为脚本设置可执行权限,并执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
# 结果
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

2、其他特殊符号:

  $#  传递到脚本的参数个数、$* 或 $@  所有向脚本传递的参数、$$  脚本运行的当前进程ID号、$!  后台运行的最后一个进程的ID号、

  $?  显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

二、shell 运算符

1、算术、关系、布尔、字符串、文件测试运算符。

2、原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

#两个数相加(注意使用的是反引号 ` 而不是单引号 ')

#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"

  两点注意:

(1)表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。

(2)完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

3、算术运算符:

#假定变量 a 为 10,变量 b 为 20:
`expr $a + $b` #30
`expr $a - $b`  #-10

`expr $a * $b` # 200
`expr $b / $a`   # 2

`expr $b % $a`  #0   取余

a=$b    # 赋值  -  将把变量 b 的值赋给 a

[ $a == $b ]  # false   -  ==  相等。用于比较两个数字,相同则返回 true
[ $a != $b ]   # true    -  !=   不相等。用于比较两个数字,不相同则返回 true

  注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]

4、关系运算符:关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

  -eq 检测两个数是否相等,相等返回 true。

  -ne 检测两个数是否不相等,不相等返回 true。

  -gt 检测左边的数是否大于右边的,如果是,则返回 true。

  -lt 检测左边的数是否小于右边的,如果是,则返回 true。

  -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。

  -le 检测左边的数是否小于等于右边的,如果是,则返回 true。

5、布尔运算符  ——  ! 非运算、-o 或运算、-a 与运算

6、逻辑运算符  ——  && 逻辑的 AND、|| 逻辑的 OR

7、字符串运算符:

  = 检测两个字符串是否相等、      != 检测两个字符串是否不相等、

  -z 检测字符串长度是否为0,为0返回 true、     -n 检测字符串长度是否不为 0

  $ 检测字符串是否为空,不为空返回 true

8、文件测试运算符:用于检测 Unix 文件的各种属性。

-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断file1是否比file2  [ "/data/file1" -nt "/data/file2" ]
-ot 判断file1是否比file2  [ "/data/file1" -ot "/data/file2" ]

三、echo 命令 - 用于字符串的输出

#显示普通字符串:
echo "It is a test"

#显示转义字符:
echo ""It is a test""

1、显示变量:read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

#!/bin/sh
read name 
echo "$name It is a test"

#以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:
[root@www ~]# sh test.sh
OK                     #标准输入
OK It is a test        #输出

2、-e 用于开启转义

#显示换行
echo -e "OK! 
" # -e 开启转义  
 换行

#显示不换行
echo -e "OK! c" # -e 开启转义 c 不换行

3、显示结果定向至文件

echo "It is a test" > myfile

4、原样输出字符串,不进行转义或取变量(用单引号)

echo '$name"'

#输出结果:
$name"

5、显示命令执行结果

echo `date`
#注意: 这里使用的是反引号 `, 而不是单引号 '。
#结果将显示当前日期

四、printf 命令

  printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。

  printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认的 printf 不会像 echo 自动添加换行符,我们可以手动添加

1、printf 命令的语法:printf format-string [arguments...]

  • format-string: 为格式控制字符串
  • arguments: 为参数列表。

2、我来用一个脚本来体现 printf 的强大功能:

printf "%-10s %-8s %-4s
" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f
" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f
" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f
" 郭芙 女 47.9876

#执行脚本,输出结果如下所示:
姓名     性别   体重kg
郭靖     男      66.12
杨过     男      48.65
郭芙     女      47.99

  %s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。

  %-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

  %-4.2f 指格式化为小数,其中 .2 指保留2位小数。

五、test 命令

1、Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

2、Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。例如

cd /bin
if test -e ./notFile -o -e ./bash
then
    echo '至少有一个文件存在!'
else
    echo '两个文件都不存在'
fi
原文地址:https://www.cnblogs.com/goloving/p/15164408.html