工具与资源核心
帮忙开发者更加高效的工作,提供围绕开发者全生命周期的工具与资源
https://developer.aliyun.com/...

本文共介绍以下内容:expr,read,echo,printf,test命令与判断符号[]

expr命令

expr命令用于求表达式的值,格局为:expr 表达式

表达式应用办法:

  • 用空格隔开每一项
  • 用反斜杠放在shell特定的字符后面(即本义)
  • 对蕴含空格和其余特殊字符的字符串要用引号括起来
  • expr会在stdout中输入后果,如果为逻辑关系表达式,后果为真stdout为1,否则为0
  • expr也有exit code,如果为逻辑关系表达式,后果为真则exit code为0,否则为1

    字符串表达式

  • length STRING:返回STRING的长度
  • index STRING CHARSET:返回CHARSET中任意单个字符在STRING中最后面的字符地位,下标从1开始。如果STRING中没有CHARSET中任一字符,则返回0。
  • substr STRING POSITION LENGTH:返回STRING字符串中从POSITION开始,长度最大为LENGTH的字串。如果POSITION或LENGTH为正数、0或非数值,则返回空字符串。
    示例:

    str="Hello World!"echo `expr length "$str"` # 留神 `` 不是单引号,示意获取 ``中command的stdout,输入12echo `expr index "$str" aWd` #输入 7,下标从1开始echo `expr substr "$str" 2 3` #输入 ell

    整数表达式

    expr反对一般的算术操作,算术表达式优先级低于字符串表达式,高于逻辑关系表达式。

  • +- :加减运算。两端参数会转换为整数,如果转换失败则会报错。
  • */ %:乘除取模运算。两端参数会转换为整数,如果转换失败则会报错。
  • ( ):能够示意优先级,但须要反斜杠本义
    示例:

    a=3b=4echo `expr $a + $b`  # 输入7echo `expr $a - $b`  # 输入-1echo `expr $a \* $b`  # 输入12,*须要本义echo `expr $a / $b`  # 输入0,整除echo `expr $a % $b` # 输入3echo `expr \( $a + 1 \) \* \( $b + 1 \)`  # 输入20,值为(a + 1) * (b + 1)

    逻辑关系表达式

  • |:如果第一个参数非空且非0,则返回第一个参数的值,否则返回第二个参数的值,但要求第二个参数的值也是非空或非0,否则返回0。如果第一个参数是非空或非0时,不会计算第二个参数。
  • &:如果两个参数都非空且非0,则返回第一个参数,否则返回0。如果第一个参为0或为空,则不会计算第二个参数。
  • < <= = == != >= > :比拟两端的参数,如果为true,则返回1,否则返回0。”==”是”=”的同义词。”expr”首先尝试将两端参数转换为整数,并做算术比拟,如果转换失败,则按字符集排序规定做字符比拟。
  • ( ):能够该表优先级,但须要用反斜杠本义
    示例:

    a=3b=4echo `expr $a \> $b`  # 输入0,>须要本义echo `expr $a '<' $b`  # 输入1,也能够将特殊字符用引号引起来echo `expr $a '>=' $b`  # 输入0echo `expr $a \<\= $b`  # 输入1c=0d=5echo `expr $c \& $d`  # 输入0echo `expr $a \& $b`  # 输入3echo `expr $c \| $d`  # 输入5echo `expr $a \| $b`  # 输入3

    read命令

    read命令用于从规范输出(stdin)中读取当行数据。当读到文件结束符(ctrl+d)时,exit code为1,否则为0。

可选参数:

  • -p:前面能够接要输入的提示信息
  • -t:前面接以秒为单位的数字,定义承受输出的等待时间,超时会主动疏忽此命令
    示例:

    read name # 读入 name 的值ubuntu # stdinecho $name # 输入 name 的值read -p "Please input your name:" -t 30 name # 读入 name 的值,等待时间 30 秒

    echo命令

    echo命令用于输入字符串,格局为echo STRING

显示一般字符串

echo "hello ubuntu"
echo hello ubuntu # 引号能够省略

显示转义字符

-e参数示意进行本义,局部转义字符必须加此参数才起作用。例如:\ \a \b \c \d \e \f \n \r \t \v,其余转义字符可能不须要-e也能够本义

echo "\"hello ubuntu\"" # 应用双引号会本义echo \"hello ubuntu\" # 也能够不应用双引号,也会本义# 若没有本义能够加参数 -eecho -e "Hi\n" # -e 开启本义echo "ubuntu":<<!第五行和第六行输入的内容如下:Hiubuntu!

显示变量

name=ubuntu
echo "hi,$name" # 输入 hi,ubuntu

显示不换行

echo -e "hi \c" # \c 示意不换行
echo "ubuntu"
输入后果为:hi ubuntu

显示后果重定向到文件

echo "hello ubuntu" > output.txt # 将显示后果以笼罩形式输入到output.txt中

原样输入字符串,不进行本义或取变量

name=ubuntu
echo '$name\"'
输入后果为:$name\"

显示命令的执行后果(stdout)

echo date
输入后果为:2021年 9月 5日 星期日 19时05分20秒 CST

printf命令

printf命令用于格式化输入,相似C/C++中的printf函数,默认不在字符串开端增加换行符。

格局:printf format-string [arguments...]

示例:

脚本内容:

printf "%10d.\n" 123  # 占10位,右对齐printf "%-10.2f.\n" 123.123321  # 占10位,保留2位小数,左对齐printf "My name is %s\n" "ubuntu"  # 格式化输入字符串printf "%d * %d = %d\n"  2 3 `expr 2 \* 3` # 表达式的值作为参数

输入后果:

       123.123.12    .My name is yxc2 * 3 = 6

逻辑运算符 && 和 ||

  • &&示意与,||示意或
  • 和expr命令中的逻辑运算类似,这两个逻辑运算符也具备短路准则:
    expr1 && expr2:当expr1为假时,跳过expr2的运算

expr1 || expr2:当expr1为真时,跳过expr2的运算

  • 表达式的exit code为0时示意真,非零示意假

    test命令

    在命令行中输出man test,能够查看test命令的用法。

test命令用exit code而不是stdout返回后果。0示意真,非零示意假。

test命令和逻辑运算合乎用做一个简略条件判断,例如:

test -e test.sh && echo "exist" || echo "not exist"#用于判断文件 test.sh 是否存在,存在则输入 exist,否则输入 not exist

文件类型判断

test -e filename # 判断文件是否存在
test -f filename # 判断是否为一般文件
test -d filename # 判断是否为目录

文件权限判断

test -r filename # 判断文件是否可读
test -w filename # 判断文件时否可写
test -x filename # 判断文件是否可执行
test -s filename # 判断文件是否非空

整数间的比拟

test $a -eq $b # a是否等于b
test $a -ne $b # a是否不等于b
test $a -gt $b # a是否大于b
test $a -lt $b # a是否小于b
test $a -ge $b # a是否大于等于b
test $a -le $b # a是否小于等于b

字符串比拟

test -z STRING # 判断STRING是否为空,是则返回true
test -n STRING # 判断STRING是否为非空,是则返回true,( -n 能够省略)
test str1 == str2 # 判断str1是否等于str2
test str1 != str2 # 判断str1是否不等于str2

多重条件断定

test -r filename -a -x filename
-a :两条件是否同时成立
-o:两条件是否至多一个成立
!: 取反。 如 test !-x file当file不可执行时,返回true

判断符号[]

[]与test的用法简直截然不同,罕用于if语句中,另外还有[[]],能够认为是一个加强版,反对更多个性,这里临时不介绍。

[ 2 -lt 3 ] # 同样返回值为 0 时代表真。留神 [ 之后有空格,]之前也有空格,否则会报错
与test相似,[]也能够与逻辑运算合用做简略的条件判断

[ -e test.sh ] && echo "exist" || echo "not exist"
须要留神的有:

  • []内的每一项都要用空格隔开
  • []内的常量、变量最好都用双引号括起来,否则可能因常量、变量里有空格导致报错

本文转自:https://developer.aliyun.com/...