我了解 Bash 中的括号扩展将扩展为多个参数。我可以将其扩展为单个参数吗?
在 Bash 中是否存在一个纯粹的解决方案来解决这个问题,而无需借助嵌套的 echo?
实际行为
command arg{1,2,3}
$1 = arg1
$2 = arg2
$3 = arg3
期望行为
$1 = arg1 arg2 arg3
$2 =
$3 =
非解决方案
command "arg{1,2,3}"
$1 = arg{1,2,3}
$2 =
$3 =
潜在解决方案(有点黑客行为?)
command "$(echo arg{1,2,3})"
$1 = arg1 arg2 arg3
$2 =
$3 =
答案1
扩展arg{1,2,3}
为arg1 arg2 arg3
称为括号扩展,将其拆分为三个单词称为单词拆分,插入命令的输出命令替换。man bash
说:
扩展的顺序是: 括号扩展; 波浪号扩展、参数和变量扩展、算术扩展和 命令替换 (从左到右进行);单词拆分;和路径名扩展。
在命令行中
printf %s\\n {1..3}
括号扩展首先发生,并使其
printf %s\\n 1 2 3
其中1
,2
和3
是单独的单词,这要归功于单词拆分。您无法改变此顺序 - 正如您所经历的,引用它不仅可以防止单词拆分,还可以防止括号扩展。但是,您可以使用命令替换来获得括号扩展,即使在双引号内也是如此:
如果 [命令] 替换出现在双引号内,单词拆分 和路径名扩展是不执行结果。
在
printf %s\\n "$(echo {1..3})"
引号内部首先被展开
printf %s\\n "$(echo 1 2 3)"
printf %s\\n "1 2 3"
并且正如引用的结果所示,它不受分词的影响:
$ printf %s\\n {1..3} "{1..3}" "$(echo {1..3})" # prints one argument per line
1
2
3
{1..3}
1 2 3
这确实不仅是最简单的方法,而且还是一个纯粹的bash
解决方案,就像内置echo
的一样bash
。