一、转义和引用
转义
通过 Shell 编程入门(一) 我们知道了如果想要获取一个变量里面的值我们可以这样:echo $d1
但是,我们就是想输出 $
符号该怎么办呢?
使用转义符号:
shell 中的一些特殊字符:
部分引用
如果我们定义的变量是这样的:aa="1 2 3"
,如果我们只是用普通的 $
获取变量,那么结果是这样的:
无论数字之间有多少个空格,最终直接通过 $
输出的结果都只用一个空格隔开,那么,我们想要原样输出该怎么办?
使用双引号包裹 $aa
即可:
如果还想在里面输出其他字符:
双引号会将里面的 $
,````(反引号),
(转义符)```翻译成特殊的含义,其余的字符原样显示,此即部分引用。
全引用
使用转义符 \
我们可以把一些具有特殊含义的字符原样输出,但是如果我们不想使用 \
该怎么办?
使用单引号包裹待输出字符:echo '$\\$`dfd'
单引号里面的字符无论是否具有特殊含义都会被原样输出,此即全引用。
反引号
如果我们想要将某个命令的执行结果作为值赋给某个变量该怎么办?
使用反引号:aa=`date`
$()
( ) 的 作 用 和 反 引 号 的 作 用 是 相 同 的 , 不 同 的 是 ‘ ‘ ‘ () 的作用和反引号的作用是相同的,不同的是 ``` ()的作用和反引号的作用是相同的,不同的是‘‘‘()```会让代码看上去更加清晰,而且还可以嵌套:
二、运算
常见运算符
使用 shell 的內建命令 let
来进行运算(不使用 let
命令的话只是简单的字符串拼接):
常见运算符,如下:加(+),减(-),乘(*),除(/),取余(%),幂(**
):
复合运算符
常见的符合运算符,如下:加等于(+=),减等于(-=),乘等于(*=),除等于(/=),余等于(%=):
$[]
和 let
命令类似:
$((…))
和 let
命令类似:
使用 bc 进行高精度计算
bc
命令也可以用来做计算,默认 bc
不显示小数,如果想使用小数,可以通过 scale 来设置:
也可以使用管道命令 |
来使用 bc
:
三、测试
test
在 shell 中如果要判断一个文件目录是否存在,该怎么办呢?
使用 test
命令:
test expression
expression 是一个表达式,可以是算数比较、字符串比较、文本和文件属性等。
test
有两个返回值:0 为 true,1 为 false。
-e
:是一个文件测试,用来判断一个文件是否存在。
这里给出常用的文件测试符,如果还有其他需求可以查阅相关文档:
注:连接文件那里,l 是个大写的 L。
[ expression ]
和 test
功能类似,比较常用,expression 也是一个表达式,同上。
注:expression 左右两边各有一个空格。
字符串测试
字符串的一些比较主要有:
- 为空判断(-z)
- 非空判断(-n)
- 等于(=)
- 不等于(!=)
- 大于(>)
- 小于(<)
如果在判断大于,小于的时候不想加转义符号,需要使用双重方括号 [[...]]
:
整数测试
整数的一些比较主要有:
- 等于(-eq)
- 不等于(-ne)
- 大于(-gt)
- 小于(-lt)
- 大于等于(-ge)
- 小于等于(-le)
注:-eq
,-eq
,-eq
,-eq
,-eq
,-eq
均为整数的测试符,不可以用来在字符串之间进行比较,否则会报错:
逻辑测试
逻辑测试主要的运算包括:
- 与(-a 或 &&)
- 或(-o 或 ||)
- 非(!)
注:如果想使用符号 &&
和 ||
,请使用双重方括号 [[ 1 -eq 1 && 2 -eq 3 ]]
。
四、判断
包括:if [ ... ]; then
,elif [ ... ]; then
,else ...
一个简单的小 demo 如下:
#!/bin/bash
# This is a test bash script
#num=8
#echo $num
if [ -z "$num" ]; then
echo "This num is empty!!!"
elif [ "$num" -eq "1" ]; then
echo "The num's value is 1"
echo "hello one"
elif [ "$num" -eq "6" ]; then
echo "You are right, the num is six"
else
echo "I don't know which num you input"
fi
注:if
必须要用 fi
结尾,否则运行脚本时会报错。