示例代码
input="cp directory_a directory_b" # obtaining value from keyboard
eval_input $input
我希望$input
可以在$0
函数中分为$1
,$2
和eval_input
。到目前为止,我使用此方法将其存档
eval_input $(echo $input)
但我想也许有更好的方法。
请注意 $input
,实际上它假设从我自己未分配的用户那里获得了它的价值。
答案 0 :(得分:3)
在shell中拆分字符串会导致许多难题。最好的解决方案是不创建字符串。使用数组:
input=(cp directory_a directory_b)
eval_input "${input[@]}"
这提供了cp
,directory_a
和directory_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中执行此操作。