shell语法(2)


一、expr命令

expr 命令用户求表达式的值,格式如下

expr 表达式

表达式说明

  • 用空格隔开每一项
  • 用\去转义一些特定字符
  • 对包含空格和其他特殊字符的字符串要用引号括起来
  • 最后是返回到stdout(标准输出)中输出结果:所以用$(command) 或者 ‘commmand’进行输出。
  • 不仅会输出一个结果,同时也会有一个返回值(0代表真,1代表假)

例如

str=“Hello World”
echo 'expr length "$str"'  #输出字符串长度12
echo 'expr index "$str" aWd' #输出aWd任一个字符最先出现的位置,这里就是W出现在7(下标从1开始),如果找不到就输出0
echo 'expr substr "$str" 2 3' #输出ell

①整数表达式

expr 支持普通的算数操作!

例如

a=3
b=4
echo 'expr $a + $b' #输出7
echo 'expr $a \* $b' #输出12
echo 'expr $a % $b' #输出3
echo 'expr \( $a + 1 \) \* \( $b + 1 \)' #输出20,等同于(3+1)*(4+1)
#除号,加号,减号,取模号都不需要转义
#也可以用单引号让其识别不为关键字
#比如'expr $a '*' $b'

②逻辑表达式

和c++大致相同,但是返回值有点点不同,比如|,&两个返回的不仅仅是0或1

例如

a=3
b=4
c=0
d=5
echo 'expr $c \& $d'  #输出0不再计算d
echo 'expr $a \& $b'  #输出a的值,返回3
echo 'expr $c \| $d'  #输出d的值,返回4
echo 'expr $a \| $b'  #输出a的值,不再计算b

二、read命令

从stdin里面读入单行数据,当读到文件结束符Ctrl + d的时候返回exit code,为1则继续读,为0则正常退出!

参数说明

  • -p : 后面可以接提示的信息
  • -t : 后面跟秒数,超过该秒数后会自动忽略此行命令

例如

#! /bin/bash
read -p "Please input your name: " -t 30 name #读入用户名,等待30s,用户不输入,自动跳过此命令
#echo "hello,$name"

那么在终端进行

acs@2ba77538d358:~$ ./test.sh
acs@2ba77538d358:~$ Please input your name: #提示用户输入
acs@2ba77538d358:~$ wjw #用户进行输入(若30s内不输入则代表name为空,进入下一行命令)
acs@2ba77538d358:~$ hello,wjw  #标准输出

三、echo命令

①显示普通字符串

echo wjw    #引号可以省略
echo "wjw"

②显示转义字符

echo "\"hello\"wjw"  #输出“hello”wjw
echo \"hello\"wjw    #不加外面引号也可以

③显示换行

echo -e "hi\nwjw"  #-e开启转义
#可以在终端用 man echo 打开帮助命令,查看一些参数
#最后输出
hi
wjw
# -c 强制不换行

④显示结果到文件内

acs@2ba77538d358:~$ ./test.sh
acs@2ba77538d358:~$ echo "hello,world" > temp.txt
#此时会在temp.txt多一个hello,world

四、printf命令

此命令可能用的不是特别多

和c语言的差不多,只不过用空格去表示括号的内容

例如

printf "%10d!\n" 123
printf "%.2f!\n" 123.2345
print "My name is %s\n" "wjw"  #字符串输出
printf "%d * %d = %d\n" 2 3 'expr 2\* 3'  #表达式的值作为参数

输出结果

​ 123!

123.23

My name is wjw

2 * 3 = 6

五、test命令

①逻辑运算符&&和||(bash里面自带的)

  • 两者均有短路的特性(用来实现类似if,else的功能)
  • 表达式最终的结果返回退出状态,如果为0则真,反之1则假!

例如

acs@2ba77538d358:~$ ls #显示当前路径下的文件
homework test.sh
acs@2ba77538d358:~$ test -e test.sh && echo "exist" || echo "not exist" #输出exist
acs@2ba77538d358:~$ test -e test2.sh && echo "exist" || echo "not exist" #输出not exist

test命令用于判断文件的类型,以及对变量做比较。

test命令用exit code作为返回状态!如果为0则真,反之1则假!

②命令格式

测试参数 代表意义
-e 文件是否存在
-f 是否是文件
-d 是否是目录

例如

acs@2ba77538d358:~$ ls #显示当前路径下的文件
homework test.sh
acs@2ba77538d358:~$ test -e test.sh
acs@2ba77538d358:~$ echo $? #返回上个命令的返回状态,输出0代表文件存在
测试参数 代表意义
-r 文件是否可读
-w 文件是否可写
-x 文件是否可执行
-s 文件是否为空

例如

acs@2ba77538d358:~$ ls #显示当前路径下的文件
homework test.sh output.txt
acs@2ba77538d358:~$ test -x output.txt
acs@2ba77538d358:~$ echo $? #返回上个命令的返回状态,输出1代表文件是不可以执行的
测试参数 代表意义
-eq a是否等于b
-ne a是否不等于b
-gt a是否大于b
-lt a是否小于b
-ge a是否大于等于b
-le a是否小于等于b

例如

acs@2ba77538d358:~$ test $a -eq $b    #判断a是否等于b
acs@2ba77538d358:~$ test 3 -lt 4
acs@2ba77538d358:~$ echo $?  #返回0,代表3小于4
测试参数 代表意义
-z CHAR 判断字符串是否为空,为空则真
-n CHAR 判断字符串是否为非空,为非空则真,-n可以省略
== 判断两个字符串是否相等,相等为真
!= 判断两个字符串是否不相等,不相等为真

例如

acs@2ba77538d358:~$ test -z "wjw" && echo "T" || echo "N"
#输出N,代表非空
acs@2ba77538d358:~$ test -n "wjw" && echo "T" || echo "N"
#输出Y,代表非空
acs@2ba77538d358:~$ s1=yxc
acs@2ba77538d358:~$ s2=wjw
acs@2ba77538d358:~$ test "s1" == "s2" && echo "T" || echo "N"
#输出N,代表两个字符串不相等
测试参数 代表意义
-a 两条件是否同时成立
-o 两条件是否至少一个成立
! 取反,如test ! -x test.txt,不可执行返回真

例如

acs@2ba77538d358:~$ ls #显示当前路径下的文件
homework.txt test.sh
acs@2ba77538d358:~$ test -x test.sh -a -r homework.txt
acs@2ba77538d358:~$ echo $?   #返回0,代表第一个文件可读,第二个文件可以执行

③判断符号[]

与test的用法几乎是一模一样的,更常用与if语句之中,括号和命令之间也要加空格

例如

acs@2ba77538d358:~$ [ 2 -lt 3 ]
acs@2ba77538d358:~$ echo $?  #返回0代表2是小于3的
acs@2ba77538d358:~$ [ "s1" == "s2" ] && echo "T" || echo "N"
#输出N,代表两个字符串不相等

注意
name=wjw wing
#不能直接用
[ $name == "wjw wing"]
#需要加上双引号,把空格包含
[ “$name” == "wjw wing"]

文章作者: sheepice
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 sheepice !
  目录