2

考虑以下脚本:

#! /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}

我怎样才能做到这一点?

4

3 回答 3

8

这是一种方式:

ex=({foo,bar,baz})
echo ${ex[@]}
foo bar baz
于 2016-05-17T08:50:17.433 回答
1

man bash

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

如您所见,变量扩展发生在大括号扩展之后。

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

mv "$@"

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

sources=("${@:1:$#-1}")
target=${@: -1}
mv "${sources[@]}" "$target"
于 2016-05-17T08:38:59.370 回答
1

大括号扩展无法按照您尝试使用它的方式工作。大括号扩展基本上用于生成要在当前命令的上下文中应用的列表。您有两种直接使用大括号扩展的主要模式(以及更多在另一个运算符的一部分中使用大括号扩展的情况。)这两种直接用途是在逗号分隔的大括号对中扩展项目列表。例如

$ 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

注意:如果没有一些可怕的诡计begin,则不允许使用变量 forend或—— 避免它。)。increment eval

于 2016-05-17T09:09:50.643 回答