命令行扩展
- 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 ~]# lsat dir0 dir3 file{1-4} file-sym link-test myneme.json noexistdir root_My testcat dir2 dir999 filel2 less My_Hexo node_modules package-lock.json sum wildtest[root@iZerb5rob3dcf6Z ~]# echo n*node_modules noexistdir[root@iZerb5rob3dcf6Z ~]# echo *.jsonmyneme.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}-backfront-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}}baA1b aA2b aB3b aB4b
创建多级目录结构:
[root@iZerb5rob3dcf6Z ~]#mkdir -pv /tmp/x/xa{y1/{a,b},y2}[root@iZerb5rob3dcf6Z ~]# tree /tmp/x/tmp/x├── xay1│ ├── a│ └── b└── xay24 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 ~]# printenvXDG_SESSION_ID=451HOSTNAME=iZerb5rob3dcf6ZTERM=xtermSHELL=/bin/bashHISTSIZE=1000SSH_CLIENT=1.49.55.242 32767 22SSH_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 67 8 9 10 11 12 1314 15 16 17 18 19 2021 22 23 24 25 26 2728 29 30
默认情况下,单词分隔会查找是否存在
空格
,
制表符
和
换行符
,并将其视为单词之间的分隔符。这意味着空格,制表符和换行符不被视为文本的一部分。它们仅充当一个空格:
[root@iZerb5rob3dcf6Z ~]# echo this is a testthis 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)) $USERtext ./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
常见转义字符