Bash命令行扩展

Bash命令行扩展

当我们每次键入命令并按Enter键后,bash都会在执行命令之前先对文本进行处理。Shell实现这一目标的过程称为扩展

[root@iZerb5rob3dcf6Z ~]# echo Today is Sunday!
Today is Sunday!
[root@iZerb5rob3dcf6Z ~]# echo *
at cat dir0 dir2 dir3 dir999 file{1-4} filel2 file-sym less link-test My_Hexo node_modules noexistdir package-lock.json root_My sum test wildtest

当回车键是按下后,shell会自动在命令行上扩展任何可扩展字符后再执行,所以echo命令并非显示“*”。这会使你回想起前面所讲的通配符,“ * ”字符表示匹配文件名中的任何字符。

路径扩展

通配符工作的机制称为路径名扩展。如下所示:

[root@iZerb5rob3dcf6Z ~]# ls
at   dir0  dir3    file{1-4}  file-sym  link-test  myneme.json   noexistdir         root_My  test
cat  dir2  dir999  filel2     less      My_Hexo    node_modules  package-lock.json  sum      wildtest
[root@iZerb5rob3dcf6Z ~]# echo n*
node_modules noexistdir
[root@iZerb5rob3dcf6Z ~]# echo *.json
myneme.json package-lock.json
[root@iZerb5rob3dcf6Z ~]# echo *[[:digit:]]
dir0 dir2 dir3 dir999 filel2
[root@iZerb5rob3dcf6Z ~]# echo /usr/*/share
/usr/local/sharevcg
隐藏文件
[root@iZerb5rob3dcf6Z ~]# echo *
at cat dir0 dir2 dir3 dir999 file{1-4} filel2 file-sym less link-test My_Hexo myneme.json node_modules noexistdir package-lock.json root_My sum test wildtest
[root@iZerb5rob3dcf6Z ~]# echo .*
. .. .bash_history .bash_logout .bash_profile .bashrc .config .cshrc .npm .pip .pki .profile .pydistutils.cfg .ssh .tcshrc .viminfo
[root@iZerb5rob3dcf6Z ~]# echo .[!.]*
.bash_history .bash_logout .bash_profile .bashrc .config .cshrc .npm .pip .pki .profile .pydistutils.cfg .ssh .tcshrc .viminfo

~ 扩展

自动展开为用户的家目录,或扩展指定用户的家目录。

[root@iZerb5rob3dcf6Z ~]# echo ~
/root
[root@iZerb5rob3dcf6Z ~]# echo ~xiongze
/home/xiongze

算数扩展

Shell允许通过扩展执行算术运算。因此我们可以使用Shell作为计算器,算术扩展使用形式:

$((exprssion))

其中expression是由值和算术运算符组成的算术表达式。算术扩展仅支持整数(整数),但可以形成许多不同的操作。以下是一些常用的运算符:
在这里插入图片描述
Example:

[root@iZerb5rob3dcf6Z ~]# echo $((2+9))
11
#表达式嵌套
[root@iZerb5rob3dcf6Z ~]# echo $(($((5*3))*2))
30
#单个括号可用于对多个`子表达式`进行分组
[root@iZerb5rob3dcf6Z ~]# echo $(((5*3)*2))
30
#除法运算
[root@iZerb5rob3dcf6Z ~]# echo 5 / 2 = $((5/2))
5 / 2 = 2
#取余
[root@iZerb5rob3dcf6Z ~]# echo 5 % 2 = $((5%2))
5 % 2 = 1

支撑扩展 {}

大括号表达式本身可以包含一个以逗号分隔的字符串列表,整数或单个字符的范围,并能够将其展开为多个路径:

[root@iZerb5rob3dcf6Z ~]# echo front-{a,b,c}-back
front-a-back front-b-back front-c-back
[root@iZerb5rob3dcf6Z ~]# echo number_{1..5}
number_1 number_2 number_3 number_4 number_5
[root@iZerb5rob3dcf6Z ~]# echo {001..007}
001 002 003 004 005 006 007
[root@iZerb5rob3dcf6Z ~]# echo {z..a}
z y x w v u t s r q p o n m l k j i h g f e d c b a
[root@iZerb5rob3dcf6Z ~]# echo a{A{1,2},B{3,4}}b
aA1b aA2b aB3b aB4b

创建多级目录结构:

[root@iZerb5rob3dcf6Z ~]#mkdir -pv /tmp/x/xa{y1/{a,b},y2} 
[root@iZerb5rob3dcf6Z ~]# tree /tmp/x
/tmp/x
├── xay1
│   ├── a
│   └── b
└── xay2

4 directories, 0 files

参数扩展

[root@iZerb5rob3dcf6Z ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@iZerb5rob3dcf6Z ~]# echo $SHELL
/bin/bash
#打印所有环境变量
[root@iZerb5rob3dcf6Z ~]# printenv
XDG_SESSION_ID=451
HOSTNAME=iZerb5rob3dcf6Z
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=1.49.55.242 32767 22
SSH_TTY=/dev/pts/0
......

命令替换

通过命令替换,我们可以将命令的输出用作扩展:

[root@iZerb5rob3dcf6Z ~]# echo $(ls)
at cat dir0 dir2 dir3 dir999 file{1-4} filel2 file-sym less link-test My_Hexo myneme.json node_modules noexistdir package-lock.json root_My sum test wildtest
#将which的结果做为参数传递给ls
[root@iZerb5rob3dcf6Z ~]# ls -l $(which cd)
-rwxr-xr-x. 1 root root 26 8月   8 2019 /usr/bin/cd

[root@iZerb5rob3dcf6Z ~]# file $(ls -d /usr/bin/* | grep zip | tail -n 1 )
/usr/bin/zipsplit: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=e259ffcdb17baf5b9599c87ad924eb51b4df53b4, stripped

双引号

如果将文字用双引号引起来,shell使用的某些特殊字符将会失去其特殊含义。“ $”“ \”“`”(反引号)例外。使用双引号,我们可以处理文件名保持嵌入式空间。假设有一个名为two word.txt的文件,如果我们尝试在命令行上使用它,则单词拆分会导致将其视为两个单独的参数,而不是所需的单个参数

[root@iZerb5rob3dcf6Z ~]# ll two words.txt/
ls: 无法访问two: 没有那个文件或目录
ls: 无法访问words.txt/: 没有那个文件或目录
[root@iZerb5rob3dcf6Z ~]# ll "two words.txt"/
总用量 0
-rw-r--r-- 1 root root 0 6月  12 11:38 file10

这意味着单词分隔路径名扩展波浪号扩展花括号扩展被抑制,但是参数扩展算术扩展命令替换仍可使用。

#不带引号的命令替换,系统将替换内容作为参数,从而显示在同一行
[root@iZerb5rob3dcf6Z ~]# echo $USER $((2+8)) $(cal)
root 10 六月 2020 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

#系统将命令后面引号内的所有内容视为一个参数,并且解释执行所包含的控制字符
[root@iZerb5rob3dcf6Z ~]# echo "$USER $((2+8)) $(cal)"
root 10       六月 2020     
日 一 二 三 四 五 六
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

默认情况下,单词分隔会查找是否存在空格制表符换行符,并将其视为单词之间的分隔符。这意味着空格,制表符和换行符不被视为文本的一部分。它们仅充当一个空格:

[root@iZerb5rob3dcf6Z ~]# echo this is a                  test
this is a test
#抑制单词拆分,并且不将嵌入的空格视为定界符,而是他们成为参数的一部分
[root@iZerb5rob3dcf6Z ~]# echo "this is a                 test"
this is a                 test

单引号

如果需要消除所有扩展,可使用单引号。

[root@iZerb5rob3dcf6Z ~]# echo text ./*.txt dir{19,20} $(echo hahaha) $((3+2)) $USER
text ./two words.txt dir19 dir20 hahaha 5 root
[root@iZerb5rob3dcf6Z ~]# echo "text ./*.txt dir{19,20} $(echo hahaha) $((3+2)) $USER"
text ./*.txt dir{19,20} hahaha 5 root
[root@iZerb5rob3dcf6Z ~]# echo 'text ./*.txt dir{19,20} $(echo hahaha) $((3+2)) $USER'
text ./*.txt dir{19,20} $(echo hahaha) $((3+2)) $USER

转义字符

有时我们只想引用一个字符。我们可以在该字符前加上//称为转义字符。通常是在双引号内有选择地防止扩展:

[root@iZerb5rob3dcf6Z ~]# echo "The balence for user $USER is: $5.00"
The balence for user root is: .00
[root@iZerb5rob3dcf6Z ~]# echo "The balence for user $USER is: \$5.00"
The balence for user root is: $5.00

转义字符通常用来消除某些字符的特殊含义。例如,某些文件名常包含带有特殊含义的字符。“ $”,“!”,“”,“”等。

[root@iZerb5rob3dcf6Z ~]# ll two\ words.txt/
总用量 0
-rw-r--r-- 1 root root 0 6月  12 11:38 file10

常见转义字符
在这里插入图片描述

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值