如何将包含的单词字符串拆分为BASH中的函数参数?

时间:2015-08-21 05:42:11

标签: bash parameters arguments

示例代码

input="cp directory_a directory_b" # obtaining value from keyboard

eval_input $input

我希望$input可以在$0函数中分为$1$2eval_input。到目前为止,我使用此方法将其存档

eval_input $(echo $input)

但我想也许有更好的方法。

请注意 $input,实际上它假设从我自己未分配的用户那里获得了它的价值。

2 个答案:

答案 0 :(得分:3)

在shell中拆分字符串会导致许多难题。最好的解决方案是不创建字符串。使用数组:

input=(cp directory_a directory_b)
eval_input "${input[@]}"

这提供了cpdirectory_adirectory_b作为eval_input的参数,其中eval_input可以引用为$1, $ 2 , and $ 3`。

即使某些命令的参数包含空格或其他困难字符,此方法也会起作用。例如,以下内容将运作良好:

input=(cp "directory a" "directory b")

尝试使用字符串而不是数组来实现这一点非常困难。

使用用户提供的字符串

您可以使用read命令将用户提供的输入分解为单个参数:

$ input="cp directory_a directory_b"
$ read -a array <<<"$input"

您可以通过检查declare -p

的输出来验证上述内容是否成功
$ declare -p array
declare -a array='([0]="cp" [1]="directory_a" [2]="directory_b")'

您可以按如下方式访问array的各个元素:

$ echo "${array[0]}"
cp
$ echo "${array[1]}"
directory_a

答案 1 :(得分:1)

您可以使用set --设置位置参数:

( input="cp directory_a directory_b"; set -- $input; echo "[$1] [$2] [$3]"; )

<强>输出:

[cp] [directory_a] [directory_b]

PS:使用(...)以避免弄乱当前的shell并在子shell中执行此操作。