也许这是一个非常愚蠢的问题。我是 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