根据变量

时间:2015-11-16 16:33:35

标签: shell unix scripting

我有变量"一个"其中包含以下内容

avi,mkw,dvd,cd

我试图动态创建看起来像这样的目录

type-avi
type-mkw
type-dvd
type-cd

我尝试使用以下代码实现想要的结果

mkdir type-{"$one"}

但它没有创建4个目录,而是创建了一个名为

的目录
type-{avi,mkw,dvd,cd}

我认为这是错误的方法..如果是这样,我怎么能用"后缀"创建动态目录?存储在variabe中?

2 个答案:

答案 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重新评估该行。

由于以下原因,我个人不会推荐这种方法:

  1. eval 可能存在安全风险且很少使用,维护人员必须进行双重操作。
  2. Brace Expansion是一个bash类型的shell扩展,虽然我喜欢bash,但我会编写所有shell脚本来运行POSIX /bin/sh
  3. 这些不会处理文件名中的异常字符,例如空格。
  4. {/ 1}}导致shell在执行变量替换后重新计算字符串。要更深入地了解这些主题,请参阅eval手册页上的“支撑扩展”和eval命令。