Fork me on GitHub

Shell 符号使用

  字符串可以用单引号、双引号、不用引号

反引号`,与单引号’, 的区别

  1、由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。
  2、由双引号括起来的字符,除$(美元符号)、\(反斜杠)、’(单引号)、和”(双引号)这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。
  3、反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。

1
2
3
4
echo `date`
注意: 这里使用的是反引号 `, 而不是单引号 '。
Thu Jul 24 10:08:46 CST 2014

$()与``(反引号

  都是用来作命令替换的
  在bash中,$( )与``(反引号)都是用来作命令替换的。
  命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。

1
2
3
4
5
echo today is $(date "+%Y-%m-%d")
echo today is `date "+%Y-%m-%d"`
#today is 2019-01-21
#today is 2019-01-21

${} 与 $()

$(cmd): echo $(ls) 执行过程
  shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,
再将此输出放到原来命令 echo $(ls)中的 $(ls)位置,即替换了$(ls),再执行echo命令

${var}:得到变量

${}

  1).变量替换:$var与${var}是没有区别的。建议用${}

1
2
3
4
5
A=Linux
echo $AB #表示变量AB
echo ${A}B #表示变量A后连接着B
# LinuxB

  2).数组操作

1
2
3
4
5
6
7
8
9
10
命令 解释 结果
${A[@]} 返回数组全部元素 a b c def
${A[*]} 同上 a b c def
${A[0]} 返回数组第一个元素 a
${#A[@]} 返回数组元素总个数 4
${#A[*]} 同上 4
${#A[3]} 返回第四个元素的长度,即def的长度 3
A[3]=xzy 则是将第四个组数重新定义为 xyz

  3).取子串

1
2
3
file=/dir1/dir2/dir3/my.file.txt
${file:0:5}    提取最左边的 5 个字节             /dir1
${file:5:5}    提取第 5 个字节右边的连续 5 个字节      /dir2

  4).替换

1
2
${file/dir/path}:将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部 dir 提换为 path:/path1/path2/path3/my

  5).取路径、文件名、后缀

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
file=/dir1/dir2/dir3/my.file.txt
我们可以用 ${ } 分别替换获得不同的值:
${file#*/}:拿掉第一条 / 及其左边的字符串:
dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一条 / 及其左边的字符串:
my.file.txt
${file#*.}:拿掉第一个 . 及其左边的字符串:file.txt
${file##*.}:拿掉最后一个 . 及其左边的字符串:txt
${file%/*}:拿掉最后条 / 及其右边的字符串:
/dir1/dir2/dir3
${file%%/*}:拿掉第一条 / 及其右边的字符串:(空值)
${file%.*}:拿掉最后一个 . 及其右边的字符串:
/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一个 . 及其右边的字符串:
/dir1/dir2/dir3/my
记忆的方法为:
# 是去掉左边(在鉴盘上 # 在 $ 之左边)
% 是去掉右边(在鉴盘上 % 在 $ 之右边)
单一符号是最小匹配﹔两个符号是最大匹配。

$(( ))

  1).整数运算

1
2
3
4
5
6
7
8
9
10
符号 功能
+ - * / 分别为加、减、乘、除
% 余数运算
& | ^ ! 分别为“AND、OR、XOR、NOT”
在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用。
a=3;b=4;c=5;
echo $((a+b*c)) # 23
echo $(($a+$b*$c)) # 23

  2).进制转换

1
2
3
4
5
6
7
$(( ))可以将其他进制转成十进制数显示出来。用法如下:
echo $((N#xx))
其中,N为进制,xx为该进制下某个数值,命令执行后可以得到该进制数转成十进制后的值。
echo $((2#110)) # 6
echo $((16#2a)) # 42
echo $((8#11)) # 9

(())

重定义变量值

1
2
3
4
5
6
a=5;b=7
((a++)); echo $a # 6
((a--)); echo $a # 5
((a<b));echo $? # 0
((a>b));echo $? # 1

-----------------本文结束,感谢您的阅读-----------------