一、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"]