Shell扩展机制详解:路径名、花括号、参数、算术与命令替换
什么是 Shell 扩展当我们按下回车键执行命令时,Bash 并不会直接运行我们输入的原始字符。相反,它会先对命令文本进行一系列的自动替换,这个预处理过程称为扩展(Expansion)。例如,echo *并不会输出星号,而是输出当前目录下的所有文件名——因为*被扩展成了匹配的文件名列表。扩展使得命令行拥有强大的动态能力,但如果不理解其规则,很容易产生意料之外的结果。本文以 Bash 为例,详解五种核心扩展类型及其行为差异。路径名扩展:通配符与文件名匹配路径名扩展是指 shell 将包含通配符的模式替换为匹配的文件名列表。常用的通配符有*(匹配任意字符)、?(匹配单个字符)以及字符类[abc]、[[:upper:]]等。$echo* Desktop Documents ls-output.txt Music Pictures Public Templates Videos $echoD* Desktop Documents $echo*s Documents Pictures Templates Videos $echo[[:upper:]]* Desktop Documents Music Pictures Public Templates Videos $echo/usr/*/share /usr/kerberos/share /usr/local/share如果模式没有匹配到任何文件,在默认配置下(nullglob未开启),模式会原样保留,而不是被替换为空。隐藏文件的特殊处理以点号开头的隐藏文件默认不会被*匹配。如果我们想列举隐藏文件,容易想到echo .*。但注意:如果未设置globskipdots选项(Bash 5.2 之后的默认行为),.*会匹配到.和..,这通常不是我们想要的。更安全的做法是使用.[!.]*:匹配只以单点开头、后面不是点的文件名。$echo.[!.]* .bashrc .config .local而ls -A命令提供了正确列出隐藏文件的功能(排除.和..)。波浪线扩展当单词以~开头时,shell 会将其扩展为对应用户的家目录。如果没有指定用户名,则扩展为当前用户的家目录。$echo~ /home/me $echo~bob /home/bob算术扩展:整数运算算术扩展允许在 shell 中直接进行整数计算,格式为$(( expression ))。支持的运算符包括加减乘除、取模、幂运算等。运算符说明+加法-减法*乘法/除法(整数除法,结果取整)%取模(余数)**幂运算$echo$((2+2))