导读
注意,这篇博客是记录博主学习的笔记,撰写风格可能不适合没有编程基础的读者。
变量
定义
不需要声明类型,只需要加赋值号(=)
输入 | 输出 |
---|---|
name=’hemim’ echo $name | hemim |
只能以数字和下划线开头,如:
输入 | 输出 |
---|---|
_name=’hemim’ echo $_name | hemim |
注意
赋值号前后不能加空格,因为shell以空格作为分隔符,每个键入词都作为一个命令
字符串
用单引号和双引号甚至不加引号的值都可以作为字符串
输入 | 输出 |
---|---|
string=abcd string=‘abcd’ string=“abcd” |
三种赋值方式的区别
首先说不加引号和加引号的区别:
很明显的是,不加引号,只能定义没有空格的字符串,我们上面说到了shell以空格作为分隔符,如果加了空格,那就不是一个整体的字符串了。所以加引号的意义显而易见的是能把空格也作为字符串的一部分。
再说说单双引号的区别:
单引号会把整个字符串原意输出,而双引号则会识别字符串的转义字符,这意味着双引号中的字符串可以加入某些业务逻辑
输入 | 输出 |
---|---|
name=hemim echo $name | hemim |
name=’hemim’ echo ‘${name}’ | ${name} |
name=’hemim’ echo “${name}” | hemim |
拼接
字符串的拼接不像java和python,java是可以用+
来拼接,python用,
来拼接,而shell则直接跟在原来的字符串后面表示拼接。如:
输入 | 输出 |
---|---|
echo “asdf”asd | asdfasd |
echo “asdf”+asd | asdf+asd |
长度
获取字符串长度:用花括号包裹变量,同时在开头加上#
输入 | 输出 |
---|---|
echo ${#name} | 5 |
字符串截取
${name:2:4}
第一个数表示从第几个字符开始截取(从1开始),第二个数表示截取的长度。通常地,第二个数不写,表示截取到末尾,第二个数超出了长度范围也不会报错,也是截取到末尾。
全局定义:name=hemim
输入 | 输出 |
---|---|
echo ${name:2:2} | mi |
echo ${name:2} | mim |
echo ${name:2:6} | mim |
字符串查找
用反引号作为操作命令:
`expr index $name h
`
expr后面跟index命令
输入 | 输出 |
---|---|
echo `expr index $name h` | 1 |
反引号
被反引号``包裹的值会被识别为linux中的命令
输入 | 输出 |
---|---|
echo `date` | Sat Nov 10 16:21:16 CST 2018 |
会输出当前日期,如果反引号里的不是命令,则会报错
数组
shell只支持一维数组,不支持多维数组,数组不定长,数组下标从0开始
声明
数组的声明类似变量声明,不过初始化的时候用()
来表示,如:
arr=(1 2 3)
注意
在多个元素之间要用空格来隔开,不是逗号
访问
数组的访问类似于其他语言arr[1],中括号里面加上元素下标,如果下标为*
号,则访问所有的元素拼接的字符串。另外,下标为@
符号,则也可以访问所以元素,返回的是一个数组。
注意
如果把arr1=${arr[*]}
,则arr输出的是一个字符串,而不是输出整个数组,所以arr1里面只有一个元素;如果arr1=${arr[@]}
,则arr1里面存储的是整个arr,相当于把arr复制给arr1。
前置输入:arr=(1 2 3)
输入 | 输出 |
---|---|
arr1=${arr[*]} echo ${arr1[0]} | 1 2 3 |
arr1=${arr[@]} echo ${arr1[0]} | 1 |
如果下标超出数组的元素个数范围,shell也不会报错,而是返回空,这是和java不一样的地方。
注释
shell用#
表示注释一行,除了第一行用#!
表示解释器外。如果想要用多行注释,可以使用花括号把代码括起来,只要不调用这个函数,就达到了注释的效果
运算符
数学运算符
原生shell不支持简单的数学运算,可以借助其他的命令来实现,如expr
,awk
全局定义:a=10 b=3
输入 | 输出 |
---|---|
`expr $a + $b` | 13 |
`expr $a - $b` | 7 |
`expr $a \* $b` | 30 |
`expr $a / $b` | 3 |
`expr $a % $b` | 1 |
注意
*
在shell里面是特殊符号,所以要加上转义字符\
关系运算符
关系运算符只支持数字的比较,不支持字符串,除非字符串的值为数字
表示 | 英文解释 | 中文解释 |
---|---|---|
-eq | equals | 等于 |
-ne | not equals | 不等于 |
-gt | greater than | 大于 |
-ge | greater-equals than | 大于等于 |
-lt | less than | 小于 |
-le | less-equals than | 小于等于 |
我们仅选取其中一个作为代表,学习一下语法即可
全局定义:a=20
,b=10
输入 | 输出 |
---|---|
if [ $a -gt $b ] then echo 'a > b’ fi | a > b |
我们看到,成功输出了a > b
注意
在使用[]
时,[
和]
前后记得使用空格。联想一下前面提到的,shell把空格作为分隔符,也就是说[
和]
是分别作为一个单独输入。这个其实很容易理解,联想我们前面间接实现的数学运算,相当于把每个输入当作一个字符串来处理,然后再在方法里面实现具体的运算逻辑。其实如果有过Handlebars模板引擎自定义helper的经验也不会奇怪这样的操作方式。
布尔运算符
表示 | 英文解释 | 中文解释 |
---|---|---|
! | 非 | |
-o | or | 或 |
-a | and | 与 |