根据变量的值创建多个目录
creating multiple directories based on value of variable
我有变量 "one",其中包含以下
avi,mkw,dvd,cd
我正在尝试动态创建如下所示的目录
type-avi
type-mkw
type-dvd
type-cd
我已尝试使用以下代码实现想要的结果
mkdir type-{"$one"}
但它没有创建 4 个目录,而是创建了一个名为
的目录
type-{avi,mkw,dvd,cd}
我想这是错误的方法。如果是这样,我如何创建动态目录 "suffixes" 存储在变量中?
为此使用数组而不是字符串变量。
IFS=, read -a onearr <<<"$one"
mkdir "${onearr[@]/#/type-}"
或者如果您一开始就不需要 $one
字符串,只需手动创建数组。
onearr=(avi mkw dvd cd)
mkdir "${onearr[@]/#/type-}"
如果您不担心 $one
中值中的空格或任何内容,并且可以相信您的输入是 "safe" 而不是剥削 和 不能使用 read
那么你 可以 使用它来创建数组(但它只是一个更糟糕的解决方案)。
onearr=($(tr , ' ' <<<"$one"))
一种无需 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
可能 存在安全风险并且很少使用,维护者必须三思。
- Brace Expansion 是一个
bash
类型的 shell 扩展,虽然我喜欢 bash,但我将所有 shell 脚本写入 运行 POSIX /bin/sh
.
- 这些不会处理文件名中的异常字符,例如空格。
eval
导致 shell 在 执行变量替换后重新评估字符串 。要获得对这些主题的更多理解,请参阅 "Brace Expansion" 和 eval
命令,它们都在 bash
手册页上。
我有变量 "one",其中包含以下
avi,mkw,dvd,cd
我正在尝试动态创建如下所示的目录
type-avi
type-mkw
type-dvd
type-cd
我已尝试使用以下代码实现想要的结果
mkdir type-{"$one"}
但它没有创建 4 个目录,而是创建了一个名为
的目录type-{avi,mkw,dvd,cd}
我想这是错误的方法。如果是这样,我如何创建动态目录 "suffixes" 存储在变量中?
为此使用数组而不是字符串变量。
IFS=, read -a onearr <<<"$one"
mkdir "${onearr[@]/#/type-}"
或者如果您一开始就不需要 $one
字符串,只需手动创建数组。
onearr=(avi mkw dvd cd)
mkdir "${onearr[@]/#/type-}"
如果您不担心 $one
中值中的空格或任何内容,并且可以相信您的输入是 "safe" 而不是剥削 和 不能使用 read
那么你 可以 使用它来创建数组(但它只是一个更糟糕的解决方案)。
onearr=($(tr , ' ' <<<"$one"))
一种无需 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
可能 存在安全风险并且很少使用,维护者必须三思。- Brace Expansion 是一个
bash
类型的 shell 扩展,虽然我喜欢 bash,但我将所有 shell 脚本写入 运行 POSIX/bin/sh
. - 这些不会处理文件名中的异常字符,例如空格。
eval
导致 shell 在 执行变量替换后重新评估字符串 。要获得对这些主题的更多理解,请参阅 "Brace Expansion" 和 eval
命令,它们都在 bash
手册页上。