Bash中$_{x..y}形式的下划线变量语法含义解析
理解 Bash 中
$_{n..m} 这类写法的含义 你提到的$_{0..10}或者带前后字符串的'ab'$_{0..10}'cd'写法,其实是Bash变量名拼接+大括号展开的组合技巧,咱们一步步拆解清楚:
核心展开逻辑
Bash的命令展开有固定顺序,这里的关键步骤是:
- 大括号展开优先:
{0..10}会先被展开为空格分隔的序列:0 1 2 ... 10; - 变量名拼接:前面的
$_会和序列中的每个数字拼接,形成一系列变量名:$_0、$_1、$_2、...、$_10; - 参数展开:这些变量(
$_0到$_10)在绝大多数情况下都是未定义的,所以每个变量会被展开为空字符串。
最终$_{0..10}会变成11个空字符串,这些空字符串会被Bash的分词机制处理(默认用空格分隔多个参数)。
结合你的测试案例逐一分析
咱们对应你给出的测试结果来验证:
echo $_{0..10}:展开为11个空参数,echo处理多个空参数时,只会输出一个换行符,所以wc返回1 0 1(1行、0个单词、1个字符即换行)。echo ''$_{0..10}'':等价于直接echo $_{0..10},11个空参数会被echo用空格分隔输出,最终是10个空格加换行,共11个字符,对应wc的1 0 11。echo ''$_{0..10}'x':每个空字符串后面拼接x,得到11个x参数,echo用空格分隔输出,所以是x x x ... x(11个x),wc统计为1行、11个单词、22个字符(11个x+10个空格+1个换行)。echo 'x'$_{0..10}'':和上面逻辑一致,每个空字符串前面加x,结果相同。echo 'ab'$_{0..10}'cd':每个空字符串前后拼接ab和cd,得到11个abcd参数,echo输出后是11个abcd用空格分隔,wc统计为1行、11个单词、55个字符(11*4 + 10个空格 +1个换行=55)。
解释那个特殊的重复字符用法
你提到的echo -e ''$_{1..100}'\b='能实现和perl -E 'say "=" x 100'一样的效果,核心是利用了退格符\b的特性:
$_{1..100}展开为100个空参数,每个参数拼接\b=后变成100个\b=;echo -e会解析转义字符,输出这些参数时,参数之间会自动添加空格;- 每个
\b会让光标退格一格,覆盖掉前面的分隔空格,然后输出=; - 最终所有空格都被替换成
=,就得到了100个连续的等号。
这其实是个巧(bian)妙(tai)的小技巧,本质还是借助空变量展开和大括号生成重复参数,再用退格符消除分隔空格来实现字符重复。
内容的提问来源于stack exchange,提问作者hkoosha




