我有一个包含这样的字符串:
apple orange pear grapes
我有一个像这样的命令:
eat food [additionalFood [additionalFood [additionalFood...]]
如果我做eat $s
,那么它会将整个字符串视为一大食物。如何将字符串分解为可传递的参数?
答案 0 :(得分:4)
它不应该把它视为一个大字符串。例如:
<强> test.sh 强>
#! /bin/bash
for stuff; do
echo "XXX: $stuff"
done
<强>命令行强>
chmod +x test.sh
s="apple orange pear grapes"
./test.sh $s
<强>输出强>
XXX: apple
XXX: orange
XXX: pear
XXX: grapes
如果这不适合您,您的IFS
变量可能会设置为非默认值。
答案 1 :(得分:1)
如果eat
不是您的直接脚本,请使用set
。在您的终端中尝试help set
set
:设置[-abefhkmnptuvxBCHP] [-o选项名称] [ - ] [arg ...] 设置或取消设置shell选项和位置参数的值。
示例:
$ allargs="foo bar baz"
$ set -- $allargs # notice no quoting here
$ echo "$1" # foo
$ echo "$2" # bar
$ echo "$3" # baz
如果eat
是直接脚本,则会为您设置$1
$2
,除非您的参数被引用
$ eat foo bar baz
## then "$1" is foo, "$2" is bar etc
$ eat "foo bar baz" # quoted arguments
## then "$1" is "foo bar baz"
更多选项包括for
循环,请参阅@Oli Charlesworth答案,
甚至是阵列:
$ arr=($allargs) # allargs as defined above, also no quoting
$ echo "${arr[0]}" # foo
$ echo "${arr[1]}" # bar
etc
答案 2 :(得分:0)
我会使用for
构造和awk
。