尝试使用大括号扩展来创建目录

尝试使用大括号扩展来创建目录

也许这是一个非常愚蠢的问题。我是 bash 脚本编写的初学者,在尝试执行命令时无法正确执行。

#!bin/bash
noise={5,10,15}dB
mkdir $(echo $noise)

我想在 bash 脚本中创建 3 个目录 5dB、10dB 和 15dB,其中 {5,10,15}dB 作为位置参数给出。该脚本不执行大括号扩展并给出文件夹 {5,10,15}dB。谁能帮我??

答案1

无需先将其存储在变量中。无论如何,大括号不会在变量赋值的右侧展开,因此您的变量将变成字面意思{5,10,15}dB

你可以这样做:

mkdir {5,10,15}dB

此外,不需要在命令替换中回显变量,所做的只是扩展变量的内容,因此:

mkdir $(echo $noise)

与以下没有什么不同:

mkdir $noise

答案2

我认为是扩展顺序让您感到困惑。 Bash 按特定顺序执行它们,首先是大括号扩展,然后是变量扩展。这就是为什么大括号扩展在您的示例中不起作用的原因。

您可以使用eval强制 bash 执行扩展:

noise={5,10,15}dB
# BAD IDEA, FOR DEMONSTRATION PURPOSES ONLY
eval mkdir $noise

然而,通常这是不好的做法,因为如果里面有一些恶意代码$noise,它也会被执行。

正如@Archemar 在评论中指出的那样,使用大批可能是一个更好的主意,例如

noise=(5 10 15)
mkdir "${arr[@]/%/dB}"

如果您从命令行传递目录名称,则大括号扩展应该不会出现问题,因为它会在您调用脚本时由交互式 shell 完成。换句话说,以下内容将起作用:

$ cat script.sh
#!/bin/bash
mkdir "$@"

$ ./script.sh {5,10,15}dB

相关内容