End

bash 教程-2 shell 字符串 转义 模式扩展 特殊符号

本文地址


目录

Bash 教程

本文改编自 网道的 Bash 教程,主要为了精简大量本人不感兴趣的内容。

Bash 字符串

字符串的表示

单引号和双引号

shell 中的字符串可以用单引号,也可以用双引号,也可以不用引号

单引号中的特殊字符(包括反斜杠)都会变为普通字符,双引号里面的大部分特殊字符会变成普通字符(除了后面提到的三个特殊字符)。

echo 白 "白" '白'   # 【白 白 白】字符串可以使用双引号、单引号包裹,也可以省略引号

# 引号嵌套
echo '单中有"双'    # 【单中有"双】,单引号中的双引号不需要转义---单引号中的特殊字符都会变为普通字符
echo "双中有'单"    # 【双中有'单】,双引号中的单引号不需要转义
echo 需\"要\'转义   # 【需"要'转义】,没有引号时,双引号、单引号都需要转义
echo "需要\"转义"   # 【需要"转义】,双引号中的双引号需要转义
echo "不"需要"转义" # 【不需要转义】,双引号中可成对出现一对双引号,作为字符串拼接使用(其实可认为是两个字符串)

# 单引号中的单引号
echo it's          # 【(等待输入)】,不正确,等待输入配对的单引号
echo 'it\'s'       # 【(等待输入)】,单引号中的特殊字符都会变为普通字符,所以单引号中不能使用反斜杠转义
echo $'it\'s'      # 【it's】,正确,不建议
echo 'it''s'       # 【its】,正确,单引号中可成对出现一对单引号,作为字符串拼接使用(其实可认为是两个字符串)

转义字符 \

echo '\'   # 【\】,单引号中的特殊字符都会变为普通字符,包括反斜杠
echo \     # 【(等待输入)】,按回车后,命令行不会立即执行,而是等待用户继续输入,直到下个回车后才会一并执行
echo \\    # 【\】,连续使用两个反斜线,可对反斜线自身转义

echo "\\"  # 【\】,双引号里面的大部分特殊字符会变成普通字符,除了【$】【\】【`】
echo "\"   # 【"】,转义后,由于缺少配对的【"】,所以会等待用户输入匹配的【"】后才会执行

不可打印字符 \n\r\t\b\a

【\a】响铃、【\b】退格、【\n】换行、【\r】回车、【\t】制表

echo "a\a\b\n\r\tb" # 【a\a\b\n\r\tb】,默认情况下,双引号和单引号会让不可打印字符变成普通字符
echo -e "a\tb"      # 【a       b】,放在双引号和单引号里面,并使用【-e】参数,会解释里面的不可打印字符

echo a\b\tc\\td     # 【abtc\td】,不加双引号和单引号时,单独的反斜杠会被忽略,不可打印字符会变成普通字符
echo -e a\b\tc\\td  # 【abtc    d】,加参数【-e】时,单独的反斜杠会被忽略,但不可打印字符也会被解释

echo a\     # 【(等待输入)】,按回车后,命令行不会立即执行,而是等待用户继续输入,直到下个回车后才会一并执行
echo "a\    # 【(等待输入)】,同上,等待用户继续输入,直到下个【"+回车】后才会一并执行
echo 'a\    # 【(等待输入)】,同上,注意,行尾的【\】不会被替换为换行或空格,而是会直接合并两行的内容

pwd;\       # 【(等待输入)】,行尾的反斜杠可以使换行符 \n 变成普通字符,从而可以将一行命令写成多行
ll

模式扩展字符 ~?*[]{}()$

a=白
echo $a "$a"    # 【白 白】,双引号里面的大部分特殊字符会变成普通字符,除了【$】【\】【`】
echo \$a "\$a"  # 【$a $a】,在特殊字符前面加上反斜杠进行转义(escape)后,可以变为普通字符
echo '$a \$a'   # 【$a \$a】,单引号中的特殊字符都会变为普通字符
echo \~ \? \*   # 【~ ? *】,不加反斜杠进行转义时,模式扩展字符会自动扩展(扩展失败时,会变为普通字符)

双引号中的三个特殊字符

单引号中的特殊字符(包括反斜杠)都会变为普通字符,双引号里面的大部分特殊字符会变成普通字符,但是以下三个特殊字符除外:

  • 美元符号 $:用来引用变量
  • 反斜杠 \:用来转义
  • 反引号 `:执行子命令
echo `pwd`      # 【/home/bqt】,使用反引号可以显示命令执行的结果
echo "`pwd`"    # 【/home/bqt】,双引号里面的大部分特殊字符会变成普通字符,除了【$】【\】【`】

echo "hello     # 换行符在双引号之中不再被解释为命令的结束,所以可以利用双引号在命令行输入多行文本
ls "b qt.txt"   # 文件名包含空格时,必须将文件名放在双引号或单引号里面
echo "a     b"  # 双引号会原样保存多余的空格
echo "$(cal)"   # 双引号会保存命令原始的输出格式,不加双引号时会单行输出

使用 Here 文档输入多行字符串

Here 文档(here document)是一种输入多行字符串的方法,格式如下:

command << token # 开始标记,由两个小于号 + Here 文档的名称组成,名称可以随意取
text             # 字符串的内容
token            # 结束标记,单独一行顶格写的 Here 文档名称
  • Here 文档的本质是重定向,它将字符串重定向输出给某个命令,相当于 echo text | command
  • Here 字符串只适合那些可以接受标准输入作为参数的命令,对于 echo 等其他命令无效
  • Here 文档不能作为变量的值,只能用于命令的参数
  • Here 文档内部会发生变量替换,并且双引号和单引号都变成了普通字符
  • Here 文档内部支持反斜杠转义,但是不支持通配符扩展
a=白
cat << bqt      # Here 文档内部会发生变量替换,并且双引号和单引号都变成了普通字符
$a "$a" '$a'    # 【白 "白" '白'】
bqt

cat << 'bqt'    # 把 Here 文档的开始标记放在单引号之中,可以避免变量替换
$a "$a" '$a'    # 【$a "$a" '$a'】
bqt

使用 Here 字符串模拟标准输入

Here 文档还有一个变体,叫做 Here 字符串(Here string),使用三个小于号(<<<)表示。它的作用是将字符串通过标准输入,传递给命令。

cat <<< 'aaa'  # 等同于【echo 'aaa' | cat】

有些命令直接接受给定的参数,与通过标准输入接受参数,结果是不一样的。例如cat命令,只能接受标准输入作为参数,如果直接将字符串放在命令后面,会被当作文件名,即cat aaa里面的aaa会被解释成文件名。这时就可以用 Here 字符串,将字符串aaa通过标准输入传给cat命令。

提取子字符串

  • ${varname:offset}:从第 offset 个字符开始(从0开始计算),截取到字符串的结尾
  • ${varname:offset:length}:从第 offset 个字符开始(从0开始计算),截取 length 个字符
  • ${varname:offset:-length}:从第 offset 个字符开始(从0开始计算),排除末尾的 length 个字符
  • ${varname: -offset}:从倒数第 offset 个字符开始(从1开始计算),截取到字符串的结尾
  • ${varname: -offset:length}:从倒数第 offset 个字符开始(从1开始计算),截取 length 个字符
  • ${varname: -offset:-length}:从倒数第 offset 个字符开始(从1开始计算),排除末尾的 length 个字符

注意事项:

  • 不能直接操作字符串,只能通过变量名来读取字符串
  • 不会改变原始字符串
  • 负的 -offset 前面必须有一个空格, 以防与 ${variable:-word} 的设置变量默认值语法混淆
bqt="baiqiantao"
echo ${#bqt}       # 【10】,字符串的长度

echo ${bqt:3}      # 【qiantao】,从第 3 个字符开始(从 0 开始计算),截取到字符串的结尾
echo ${bqt:3:4}    # 【qian】,从第 3 个字符开始(从 0 开始计算),截取 4 个字符
echo ${bqt:3:-1}   # 【qianta】,从第 3 个字符开始(从 0 开始计算),排除末尾的 1 个字符

echo ${bqt: -3}    # 【tao】,从倒数第 3 个字符开始(从 1 开始计算),截取到字符串的结尾
echo ${bqt: -3:2}  # 【ta】,从倒数第 3 个字符开始(从 1 开始计算),截取 2 个字符
echo ${bqt: -3:-1} # 【ta】,从倒数第 3 个字符开始(从 1 开始计算),排除末尾的 1 个字符

# 越界情况
echo ${bqt:11:-1}  # 【空字符串】,如果 offset 越界了,那么直接返回空字符串,后面的 length 无效
echo ${bqt:10:-1}  # 【报错】,如果 offset 没有越界,那么排除的长度 length 不能超过子字符串的长度
echo ${bqt: -3:-4} # 【报错】,如果 offset 没有越界,那么排除的长度 length 不能超过子字符串的长度
echo ${bqt:3:40}-${bqt: -3:40} # 【qiantao-tao】,如果 offset 没有越界,那么截取的长度没有大小限制

# 以下全部返回空字符串
echo ${bqt:30}-${bqt:30:4}-${bqt:30:-4}-${bqt:30:40}-${bqt:30:-40}
echo ${bqt: -30}-${bqt: -30:4}-${bqt: -30:-4}-${bqt: -30:40}-${bqt: -30:-40}

替换匹配的字符串

如果模式匹配成功,就删除匹配的部分,返回剩下的部分(原始变量不会发生变化)。如果匹配不成功,则返回原始字符串。

字符串头部的模式匹配

检查 pattern 是否匹配变量 var 的开头

  • ${var#pattern}:如果匹配,则删除最短匹配(又称非贪婪匹配)的部分,返回剩余部分
  • ${var##pattern}:如果匹配,则删除最长匹配(又称贪婪匹配)的部分,返回剩余部分
  • ${var/#pattern/string}:如果匹配,则将匹配的部分替换成 string(可为空) 后返回
path=/home/bqt/test/hello
echo ${path#/*/}   # 【bqt/test/hello】,匹配模式【/*/】的最短匹配是【/home/】
echo ${path##/*/}  # 【hello】,匹配模式【/*/】的最长匹配是【/home/bqt/test/】
echo ${path#*/}    # 【home/bqt/test/hello】,匹配模式【*/】的最短匹配是【/】
echo ${path##*/}   # 【hello】,匹配模式【*/】的最长匹配是【/home/bqt/test/】,此模式可用来返回文件名

foo=home/bqt/test/hello
echo ${foo/#home/xxx}        # 【xxx/bqt/test/hello】,将【home】替换为【xxx】
echo ${foo/#home*test/xxx}   # 【xxx/hello】,将【home/bqt/test】替换为【xxx】
echo ${foo/#home*test//xxx}  # 【/xxx/hello】,将【home/bqt/test】替换为【/xxx】
echo ${foo/#home*test\//xxx} # 【xxxhello】,将【home/bqt/test/】替换为【xxx】
echo ${foo/##*/xxx}          # 【home/bqt/test/hello】,不支持【##】,匹配模式会识别为【#*】

字符串尾部的模式匹配

检查 pattern 是否匹配变量 var 的尾部

  • ${var%pattern}:如果匹配,则删除最短匹配(又称非贪婪匹配)的部分,返回剩余部分
  • ${var%%pattern}:如果匹配,则删除最长匹配(又称贪婪匹配)的部分,返回剩余部分
  • ${var/%pattern/string}:如果匹配,则将匹配的部分替换成 string(可为空) 后返回
path=/home/bqt/test/hello
echo ${path%t*}     # 【/home/bqt/tes】
echo ${path%%t*}    # 【/home/bq】
echo ${path%/*}     # 【/home/bqt/test】,此模式可删除路径的文件名部分,只留下目录部分

echo ${path/%hello/xxx}      # 【/home/bqt/test/xxx】,将【hello】替换为【xxx】
echo ${path/%b*hello/xxx}    # 【/home/xxx】,将【bqt/test/hello】替换为【xxx】
echo ${path/%t/*hello/xxx}   # 【/home/bqt/test/hello】,因为不匹配结尾,所以返回原始字符串
echo ${path/%t\/*hello/xxx}  # 【/home/bqxxx】,将【t/test/hello】替换为【xxx】,贪婪匹配
echo ${path/%%*/xxx}         # 【home/bqt/test/hello】,不支持【%%】,匹配模式会识别为【%*】

任意位置的模式匹配

检查 pattern 是否匹配变量 var 的一部分

  • ${var/pattern/string}:如果匹配,则将最长匹配的那部分替换成 string 后返回,仅替换第一个匹配
  • ${var//pattern/string}:如果匹配,则将最长匹配的那部分替换成 string 后返回,所有匹配都替换
  • 如果省略了 string 部分,相当于匹配的部分替换成空字符串,即删除匹配的部分
path=home/bqt/test/hello

echo ${path/??t/xxx}    # 【home/xxx/test/hello】仅替换第一个匹配
echo ${path//??t/xxx}   # 【home/xxx/txxx/hello】所有匹配都替换
echo ${path/\/*t/xxx}   # 【homexxx/hello】最长匹配
echo ${path//\/*t/xxx}  # 【homexxx/hello】最长匹配
echo ${path//??t/}      # 【home//t/hello】删除所有匹配的部分

echo -e ${PATH//:/"\n"} # 将环境变量 PATH 中的所有分隔符,由【:】替换成【\n】,并解释为换行符

计算字符位置

expr index "$var" sub:返回字符串 sub 中的所有字符,在变量 var 中的最小位置

bqt="baiqiantao"
echo `expr index "$bqt" a`  #【2】,返回字符 a 在变量中的最小位置
echo `expr index "$bqt" qa` #【2】,返回字符 q 或 a 在变量中的最小位置
echo `expr index "$bqt" xy` #【0】,如果所有字符都不存在,则返回 0
echo `expr index "$bqt" xq` #【4】,忽略不存在的字符 x,返回字符 q 在变量中的最小位置

其他简单操作

  • ${#varname}:字符串的长度
  • ${varname^^}:转为大写
  • ${varname,,}:转为小写
bqt="baiQianTao"
echo ${#bqt}  # 【10】,字符串的长度
echo $#bqt    # 【0bqt】,大括号是必需的,否则会将 $# 理解成脚本的参数个数,将变量名理解成文本

echo ${bqt^^} # 【BAIQIANTAO】,转为大写
echo ${bqt,,} # 【baiqiantao】,转为小写

Bash 的模式扩展

Shell 接收到用户输入的命令以后,会根据空格将用户的输入,拆分成一个个词元(token)。然后,Shell 会扩展词元里面的特殊字符(~?*[]{}$),扩展完成后才会调用相应的命令。这种特殊字符的扩展,称为模式扩展(globbing)。

Bash 是先进行扩展,再执行命令。扩展的结果是由 Bash 负责的,与所要执行的命令无关。命令本身并不存在参数扩展,收到什么参数就原样执行。

模块扩展的英文单词是globbing,这个词来自于早期的 Unix 系统有一个/etc/glob文件,保存扩展的模板。后来 Bash 内置了这个功能,但是这个名字就保留了下来。

模式扩展与正则表达式的关系是:模式扩展的出现早于正则表达式,可以看作是原始的、早期的、低配版正则表达式,它的功能没有正则那么强大灵活,但是优点是简单和方便。

set -f  # 【set -o noglob】关闭扩展
set +f  # 【set +o noglob】打开扩展

文件名扩展

文件名扩展字符只有 文件存在 的前提下才会扩展,如果不存在可匹配的文件名,就会原样输出。

用户主目录 ~

波浪线~会扩展成当前用户的主目录。

echo ~      # 【/home/bqt】波浪线 ~ 会扩展成当前用户的主目录
echo ~/foo  # 【/home/bqt/foo】主目录的某个子目录
echo ~root  # 【/root】用户 root 的主目录
echo ~foo   # 【~foo】如果用户名 foo 不存在,就会原样输出
echo ~+     # 扩展成当前所在的目录,等同于【pwd】命令

单个字符 ?

字符?代表文件路径里面的任意单个字符,不包括空字符。

ls ?.txt    # 【a.txt】字符 ? 代表文件路径里面的任意单个字符,不包括空字符
ls ??.txt   # 【ab.txt】如果匹配多个字符,就需要多个 ? 连用
echo ?.bqt  # 【?.bqt】如果不存在可匹配的文件名,就会原样输出

任意字符 *

字符*代表文件路径里面的任意数量的任意字符,包括零个字符。*不会匹配以.开头的隐藏文件

echo *.txt   # 【a.txt ab.txt】字符 * 代表文件路径里面的任意数量的任意字符,包括零个字符
echo *       # 输出当前目录所有文件,不包括以 . 开头的隐藏文件,不包括子目录中的文件
echo *.bqt   # 【*.bqt】如果不存在可匹配的文件名,就会原样输出

echo .*      # 输出当前目录所有隐藏文件(即以 . 开头的文件)
echo .[!.]*  # 输出当前目录所有隐藏文件,同时排除 .(当前目录)和 ..(上级目录)这两个隐藏文件

*只匹配当前目录,不会匹配子目录

echo */      # 输出当前目录所有子目录
echo */*     # 输出当前目录所有子目录中的所有文件
echo */*/    # 输出当前目录所有二级子目录
echo */*/*   # 输出当前目录所有二级子目录中的所有文件,有几层子目录,就必须写几层星号

打开 globstar 参数以后,** 可以匹配零个或多个任意深度子目录(Bash 4.0 中新增)

shopt globstar    # 查询某个参数关闭还是打开,globstar 参数默认是关闭的
shopt -s globstar # 打开某个参数,打开 globstar 参数以后,** 可以匹配零个或多个子目录
shopt -u globstar # 关闭某个参数
echo **/*         # 输出当前目录以及【任意深度子目录】中的所有文件

任一字符 []

  • 方括号扩展 [...] 可以扩展任意一个括号之中的字符
  • 排除模式 [^...][!...] 可以扩展任意一个不在方括号中的字符
  • 如果需要匹配字符 [,可以放在方括号内任意位置,不支持匹配字符 ]
  • 如果需要匹配字符 -,只能放在方括号内部的开头或结尾
echo [ab].txt  # 方括号扩展 [...] 可以扩展任意一个括号之中的字符
echo [^ab]     # 等价于 [!ab],表示扩展任意一个不在方括号中的字符
echo [[ab]     # 如果需要匹配字符 [,可以放在方括号内任意位置,不支持匹配字符 ]
echo [-ab]     # 如果需要匹配字符 -,只能放在方括号内部的开头或结尾
echo [ab].bqt  # 【[ab].bqt】如果不存在可匹配的文件名,就会原样输出

方括号扩展有一个简写形式[start-end],表示匹配一个连续的范围。

  • [a-z]:所有小写字母的字符
  • [!a-z]:所有非小写字母的字符
  • [a-zA-Z]:所有小写字母 + 大写字母
  • [a-zA-Z0-9]:所有小写字母 + 大写字母 + 数字
  • program.[co]:文件program.c与文件program.o
  • BACKUP.[0-9][0-9][0-9]:所有以BACKUP.开头,后面是三个数字的文件名

字符类 [[:class:]]

[[:class:]] 表示一个字符类,扩展成某一类特定字符之中的一个。

  • [[:digit:]]:匹配任意数字 0-9
  • [[:lower:]]:匹配任意小写字母 a-z
  • [[:upper:]]:匹配任意大写字母 A-Z
  • [[:alpha:]]:匹配任意英文字母
  • [[:alnum:]]:匹配任意英文字母与数字
  • [[:cntrl:]]:ASCII 码 0-31 的不可打印字符
  • [[:print:]]:ASCII 码 32-127 的可打印字符
  • [[:punct:]]:标点符号(除了 A-Z、a-z、0-9 的可打印字符)
  • [[:graph:]]:匹配任意英文字母、数字、标点符号
  • [[:blank:]]:空格和 Tab 键
  • [[:space:]]:空格、Tab、LF(10)、VT(11)、FF(12)、CR(13)
  • [[:xdigit:]]:匹配16进制字符(A-F、a-f、0-9)
echo [[:upper:]]*  # 输出所有以大写字母开头的文件名
echo [![:digit:]]* # 输出所有不以数字开头的文件名
echo [[:blank:]]*  # 【[[:blank:]]*】如果不存在可匹配的文件名,就会原样输出

量词语法 ?+*!@()

量词语法用来控制模式匹配的次数。它只有在 Bash 的 extglob 参数打开的情况下才能使用,不过一般是默认打开的。

shopt extglob     # 查询某个参数关闭还是打开,extglob 参数默认是打开的
shopt -s extglob  # 打开某个参数,打开 extglob 参数以后,可以使用量词语法
shopt -u extglob  # 关闭某个参数
  • ?(pattern-list):匹配零个或一个模式
  • *(pattern-list):匹配零个或多个模式
  • +(pattern-list):匹配一个或多个模式
  • @(pattern-list):只匹配一个模式
  • !(pattern-list):匹配给定模式以外的任何内容
ls abc?(def)       # 【abc abcdef】匹配以 abc 开头、且以零个或一个 def 结尾的文件
ls abc+(.txt|.php) # 【abc.php abc.txt】匹配以 abc 开头、且以 .txt 或 .php 结尾的文件
ls abc+(.txt)      # 【abc.txt abc.txt.txt】匹配以 abc 开头、且以 .txt 结尾的文件
ls a!(b)c.txt      # 【aac.txt ac.txt】匹配除了 abc.txt 以外,以 a 开头、且以 c.txt 结尾的文件
echo abc*(.bqt)    # 【abc*(.bqt)】如果不存在可匹配的文件名,就会原样输出

字符串扩展 {}

大括号扩展 {...} 表示分别扩展成大括号里面的所有值。

  • 各个值之间使用逗号分隔,值可以是多字符的模式
  • 逗号前面可以没有值,表示扩展的第一项为空
  • 逗号前后不能有空格,否则,Bash 会认为这不是大括号扩展,而是独立的参数
  • 大括号可以嵌套,可以与其他模式联用,并且总是先于其他模式进行扩展
  • 大括号扩展不是文件名扩展,它总是会扩展的,这与方括号扩展 [...] 完全不同
echo {1,2,3}          # 【1 2 3】大括号扩展 {...} 表示分别扩展成大括号里面的所有值
ls {,a,abc}.txt       # 依次访问 .txt a.txt abc.txt 三个文件,而不管文件是否存在
echo a{a{1,2},b{3,4}} # 【aa1 aa2 ab3 ab4】支持嵌套
echo /bin/{cat,ba*}   # 大括号也可以与其他模式联用,并且总是先于其他模式进行扩展

大括号扩展可直接用于for循环。

for i in {1,2,4,白乾涛}
do
  echo $i
done
  • 大括号扩展的简写形式 {start..end} 表示扩展成一个连续序列
  • 大括号扩展另一个简写形式 start..end..step 可指定扩展的步长
  • 简写形式支持逆序、支持嵌套
echo {01..5}          # 【01 02 03 04 05】扩展成一个连续序列
echo {0..8..2}        # 【0 2 4 6 8】可指定扩展的步长
echo {a..c}{1,2}      # 【a1 a2 b1 b2 c1 c2】多个简写形式连用,会有循环处理的效果
echo .{mp{5..3},mkv}  # 【.mp5 .mp4 .mp3 .mkv】支持逆序,支持嵌套
echo {a1..3c}         # 【{a1..3c}】遇到无法理解的简写时会原样输出,不会扩展

美元符号扩展

变量扩展 $

Bash 将美元符号$开头的词元视为变量,将其扩展成变量值。${!string*}${!string@}返回所有匹配给定字符串string的变量名。

echo $SHELL   # 【/bin/bash】
echo ${SHELL} # 【/bin/bash】变量名也可以放在 ${} 里面
echo ${!S*}   # 返回所有以 S 开头的变量名,如果不存在,则返回空

子命令扩展 $(...)

$(...) 可以扩展成另一个命令的运行结果,该命令的所有输出都会作为返回值。

echo $(date)       # 返回 date 命令的运行结果,注意 date 是一个命令而非一个变量
echo `date`        # 将子命令放在反引号之中,也可以扩展成命令的运行结果
echo $(ls $(pwd))  # 子命令扩展可以嵌套

算术扩展 $((...))

$((...)) 可以扩展成整数运算的结果。

echo $((2 + 2))  # 4

模式扩展相关的 shopt 命令

shopt命令可以调整 Bash 的行为。它有好几个参数跟通配符扩展有关。

shopt [optionname]    # 查询某个参数关闭还是打开
shopt -s [optionname] # 打开某个参数
shopt -u [optionname] # 关闭某个参数
  • dotglob:默认关闭,可以让扩展结果包括隐藏文件,即以点开头的文件。
  • nullglob:默认关闭,可以让通配符不匹配任何文件名时,返回空字符串而非原样返回
  • failglob:默认关闭,可以让通配符不匹配任何文件名时,直接报错,而非继续让各个命令去处理。
  • extglob:默认打开,可以让 Bash 支持 ksh 的一些扩展语法。它的主要应用是支持量词语法
  • nocaseglob:默认关闭,可以让通配符扩展不区分大小写。
  • globstar:默认关闭,可以让 ** 匹配零个或多个子目录(Bash 4.0 中新增)。

模式扩展使用注意点

  • 通配符是先解释,再执行:Bash 接收到命令以后,如果发现里面有通配符,会先进行通配符扩展,然后再执行命令。
  • 文件名扩展在没有可匹配的文件时,会原样输出。
  • 所有文件名扩展只匹配单层路径,无法匹配子目录里面的文件(即:不能匹配路径分隔符/)。
  • Bash 允许文件名使用通配符,即文件名包括特殊字符。这时引用文件名,需要把文件名放在单引号或双引号里面。

2022-01-02

posted @ 2022-01-02 22:24  白乾涛  阅读(2400)  评论(0编辑  收藏  举报