引号中的括号扩展

引号中的括号扩展

我了解 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

其中123是单独的单词,这要归功于单词拆分。您无法改变此顺序 - 正如您所经历的,引用它不仅可以防止单词拆分,还可以防止括号扩展。但是,您可以使用命令替换来获得括号扩展,即使在双引号内也是如此:

如果 [命令] 替换出现在双引号内,单词拆分 和路径名扩展是不执行结果。

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

相关内容