zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    [单链表]链表指针追赶问题
    二叉查找树与平衡二叉树
    二叉树的下一个结点
    fork进程函数总结
    《Effective C++》Item2:尽量以const,enum,inline替换#define
    Hash表的使用
    [数字]整数数字的算法
    算法题:找出整数数组中两个只出现一次的数字
    删除元素的操作
    [Reprinted] 使用Spring Data Redis操作Redis(一) 很全面
  • 原文地址:https://www.cnblogs.com/goloving/p/15164408.html
Copyright © 2011-2022 走看看