AI智能
改变未来

Bash命令行扩展

命令行扩展

  • 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

    常见转义字符

    总结

    赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » Bash命令行扩展