如何对变量进行大括号扩展?
How can I do brace expansion on variables?
考虑以下脚本:
#! /bin/bash -e
echo {foo,bar}
EX={foo,bar}
echo ${EX}
这个脚本的输出是:
foo bar
{foo,bar}
我希望 echo
命令对 ${EX}
执行大括号扩展。因此,我希望看到
的输出
foo bar
foo bar
我想创建一个脚本,用户可以在其中提供带大括号的路径,其中每个扩展版本都会被复制。
像这样:
#! /bin/bash -e
$SOURCES=
$TARGET=
cp -r ${SOURCES} ${TARGET}
我怎样才能做到这一点?
参见man bash
:
The order of expansions is: brace expansion, tilde expansion, parameter, variable and arithmetic expansion and command substitution (done in a left-to-right fashion), word splitting, and pathname expansion.
如您所见,变量扩展发生在大括号扩展之后。
幸运的是,您根本不需要它:让用户指定支撑路径,让 shell 展开它们。然后你就可以
mv "$@"
如果需要分隔参数,使用数组和参数扩展:
sources=("${@:1:$#-1}")
target=${@: -1}
mv "${sources[@]}" "$target"
这是一个方法:
ex=({foo,bar,baz})
echo ${ex[@]}
foo bar baz
大括号展开与您尝试使用的方式不同。大括号扩展基本上用于生成要在当前命令的上下文中应用的列表。您有两种主要模式,其中直接使用大括号扩展(还有更多模式将大括号扩展用作另一个运算符的一部分。)这两种直接用途是扩展 逗号分隔 [= 中的项目列表35=]一对牙套。例如
$ touch file_{a,b,c,d}.txt
执行命令后,brace expansion 在当前目录中创建所有四个文件名格式正确的文件:
$ ls -1 file*.txt
file_a.txt
file_b.txt
file_c.txt
file_d.txt
您也可以以类似的方式使用 brace-expansion 来生成用于循环迭代的列表(或任何需要生成 system/range 数字的地方)。这里使用 brace expansion 的语法类似,但在大括号内使用 ..
分隔符(而不是 ','
分隔符)。语法是{begin..end..increment}
(其中增量既可以是正数也可以是负数)例如
$ for i in {20..-20..-4}; do echo $i; done)
20
16
12
8
4
0
-4
-8
-12
-16
-20
(注意: 使用 begin
、end
或 increment
的变量是不允许的,除非 可怕 eval
诡计——避免它。)。
考虑以下脚本:
#! /bin/bash -e
echo {foo,bar}
EX={foo,bar}
echo ${EX}
这个脚本的输出是:
foo bar
{foo,bar}
我希望 echo
命令对 ${EX}
执行大括号扩展。因此,我希望看到
foo bar
foo bar
我想创建一个脚本,用户可以在其中提供带大括号的路径,其中每个扩展版本都会被复制。
像这样:
#! /bin/bash -e
$SOURCES=
$TARGET=
cp -r ${SOURCES} ${TARGET}
我怎样才能做到这一点?
参见man bash
:
The order of expansions is: brace expansion, tilde expansion, parameter, variable and arithmetic expansion and command substitution (done in a left-to-right fashion), word splitting, and pathname expansion.
如您所见,变量扩展发生在大括号扩展之后。
幸运的是,您根本不需要它:让用户指定支撑路径,让 shell 展开它们。然后你就可以
mv "$@"
如果需要分隔参数,使用数组和参数扩展:
sources=("${@:1:$#-1}")
target=${@: -1}
mv "${sources[@]}" "$target"
这是一个方法:
ex=({foo,bar,baz})
echo ${ex[@]}
foo bar baz
大括号展开与您尝试使用的方式不同。大括号扩展基本上用于生成要在当前命令的上下文中应用的列表。您有两种主要模式,其中直接使用大括号扩展(还有更多模式将大括号扩展用作另一个运算符的一部分。)这两种直接用途是扩展 逗号分隔 [= 中的项目列表35=]一对牙套。例如
$ touch file_{a,b,c,d}.txt
执行命令后,brace expansion 在当前目录中创建所有四个文件名格式正确的文件:
$ ls -1 file*.txt
file_a.txt
file_b.txt
file_c.txt
file_d.txt
您也可以以类似的方式使用 brace-expansion 来生成用于循环迭代的列表(或任何需要生成 system/range 数字的地方)。这里使用 brace expansion 的语法类似,但在大括号内使用 ..
分隔符(而不是 ','
分隔符)。语法是{begin..end..increment}
(其中增量既可以是正数也可以是负数)例如
$ for i in {20..-20..-4}; do echo $i; done)
20
16
12
8
4
0
-4
-8
-12
-16
-20
(注意: 使用 begin
、end
或 increment
的变量是不允许的,除非 可怕 eval
诡计——避免它。)。