myFunction()
{
> /tmp/file_$1_$2
}
ELEMENTS=("first" "second" "a third" "a fourth")
for elem in "${ELEMENTS[@]}"
do
myFunction "$elem"
done
我已经尝试了上面的代码和在线发现的一些其他变种:
BASH array with spaces in elements
Loop through array of arrays of string with spaces
但我永远无法让它发挥作用。我希望我的代码要做的是迭代这些元素:
first
second
a third
a fourth
将它们传递给myFunction
,但将函数视为a third
作为2个参数,而不是1!所以我最终会得到4个文件:
/tmp/file_first_
/tmp/file_second_
/tmp/file_a_third
/tmp/file_a_fourth
无论我尝试什么,要么将每个单词视为不同的元素(6个调用myFunction
)或对待,例如a third
作为一个参数并创建一个文件/tmp/file_a third_
或其他不同的东西。
如何在bash中正确执行此操作?
答案 0 :(得分:2)
如果您想要进行单词拆分,那么您不应该引用您的变量:
myFunction $elem
以下是一个示例,使用printf
来演示:
$ elements=("first" "second" "a third" "a fourth")
$ func() { printf '/tmp/file_%s_%s\n' "$1" "$2"; }
$ for elem in "${elements[@]}"; do func $elem; done
/tmp/file_first_
/tmp/file_second_
/tmp/file_a_third
/tmp/file_a_fourth
答案 1 :(得分:2)
调用函数时只删除双引号:
myFunction $elem
其余代码没问题。
但是,您可以使用参数扩展尝试:
myFunction()
{
> /tmp/file_${1// /_}
}
ELEMENTS=("first" "second" "a third" "a fourth")
for elem in "${ELEMENTS[@]}"
do
myFunction "$elem"
done
我认为这种方法可以更好,因为如果存在这样的元素:
"a fifth ones"
myFunction()将创建:
/tmp/file_a_fifth_ones
说明:
$ var1="I'm the content of a var"
$ echo "${var1// /_}"
结果:
I'm_the_content_of_a_var