如何将包含的单词字符串拆分为 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
希望$input
在eval_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[@]}"
这提供 cp
、directory_a
和 directory_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
示例代码
input="cp directory_a directory_b" # obtaining value from keyboard
eval_input $input
希望$input
在eval_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[@]}"
这提供 cp
、directory_a
和 directory_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