带空格的数组元素是函数的参数

时间:2016-07-15 15:50:52

标签: arrays bash loops arguments

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

https://unix.stackexchange.com/questions/181507/bash-script-array-elements-containing-space-character

但我永远无法让它发挥作用。我希望我的代码要做的是迭代这些元素:

  1. first
  2. second
  3. a third
  4. a fourth
  5. 将它们传递给myFunction,但将函数视为a third作为2个参数,而不是1!所以我最终会得到4个文件:

    1. /tmp/file_first_
    2. /tmp/file_second_
    3. /tmp/file_a_third
    4. /tmp/file_a_fourth
    5. 无论我尝试什么,要么将每个单词视为不同的元素(6个调用myFunction)或对待,例如a third作为一个参数并创建一个文件/tmp/file_a third_或其他不同的东西。

      如何在bash中正确执行此操作?

2 个答案:

答案 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