我有变量"一个"其中包含以下内容
avi,mkw,dvd,cd
我试图动态创建看起来像这样的目录
type-avi
type-mkw
type-dvd
type-cd
我尝试使用以下代码实现想要的结果
mkdir type-{"$one"}
但它没有创建4个目录,而是创建了一个名为
的目录type-{avi,mkw,dvd,cd}
我认为这是错误的方法..如果是这样,我怎么能用"后缀"创建动态目录?存储在variabe中?
答案 0 :(得分:4)
使用数组而不是字符串变量。
IFS=, read -a onearr <<<"$one"
mkdir "${onearr[@]/#/type-}"
或者,如果您首先不需要$one
字符串,只需手动创建数组。
onearr=(avi mkw dvd cd)
mkdir "${onearr[@]/#/type-}"
如果您不担心$one
中值的空格或任何内容,并且可以相信您的输入是“安全的”而不是剥削性和则无法使用{{1然后你可以使用它来创建数组(但它只是更糟糕的解决方案)。
read
答案 1 :(得分:0)
使用传统工具管道方法,在没有read
shell的情况下执行此操作的方法:
echo "$one" |
tr ',' '\n' |
sed "s/^/mkdir 'type-/; s/$/'/" |
sh -x
你最初的尝试非常接近。要使其工作,您可以使用shell eval
命令:
eval mkdir type-{$one}
或
echo mkdir type{"$one"} | bash
在任何一种情况下,效果都会导致bash
重新评估该行。
由于以下原因,我个人不会推荐这种方法:
eval
可能存在安全风险且很少使用,维护人员必须进行双重操作。bash
类型的shell扩展,虽然我喜欢bash,但我会编写所有shell脚本来运行POSIX /bin/sh
。 {/ 1}}导致shell在执行变量替换后重新计算字符串。要更深入地了解这些主题,请参阅eval
手册页上的“支撑扩展”和eval
命令。