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

How to split contained words string to to function parameters in BASH?

示例代码

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

eval_input $input

希望$inputeval_input函数中拆分成[=14=]</code>和<code>。到目前为止我用这个方法来存档它

eval_input $(echo $input)

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

注意这里 $input,实际上是假设从用户那里获取的值,不是我自己分配的。

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

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

输出:

[cp] [directory_a] [directory_b]

PS:使用 (...) 避免弄乱当前 shell 并在子 shell.

中执行此操作

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

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

这提供 cpdirectory_adirectory_b 作为 eval_input 的参数,eval_input 可以引用为 ,$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