如何对变量进行大括号扩展?

时间:2016-05-17 08:29:11

标签: bash shell brace-expansion

考虑以下脚本:

#! /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=$1
$TARGET=$2

cp -r ${SOURCES} ${TARGET}

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:5)

这是一种方式:

ex=({foo,bar,baz})
echo ${ex[@]}
foo bar baz

答案 1 :(得分:1)

请参阅man bash

  

扩展的顺序是:大括号扩展,波浪扩展,参数,变量和算术扩展以及命令替换(以从左到右的方式完成),单词拆分和路径名扩展。

如您所见,变量扩展发生的时间晚于大括号扩展。

幸运的是,根本不需要它:让用户指定支撑路径,让shell扩展它们。然后你可以

mv "$@"

如果需要分隔参数,请使用数组和参数扩展:

sources=("${@:1:$#-1}")
target=${@: -1}
mv "${sources[@]}" "$target"

答案 2 :(得分:1)

Brace扩展功能与您尝试使用它的方式不同。支撑扩展基本上用于生成要在当前命令的上下文中应用的列表。您有两个主要模式,其中直接使用大括号扩展(还有更多大括号扩展用作另一个运算符的一部分。)两个直接用途是扩展逗号分隔中的项目列表一对大括号。 e.g。

$ touch file_{a,b,c,d}.txt

执行命令后,大括号扩展会在当前目录中创建具有格式正确的文件名的所有四个文件:

$ ls -1 file*.txt
file_a.txt
file_b.txt
file_c.txt
file_d.txt

您也可以以类似的方式使用大括号扩展来生成循环迭代列表(或者需要生成的系统/数字范围)。这里使用大括号扩展的语法类似,但在大括号内使用..分隔符(而不是','分隔)。语法为{begin..end..increment}(其中增量可以是正数和负数),例如。

$ for i in {20..-20..-4}; do echo $i; done)
20
16
12
8
4
0
-4
-8
-12
-16
-20

注意:使用beginendincrement的变量是不允许的,如果没有一些可怕的 {{1}诡计 - 避免它。)。