使用以空格分隔的字符串作为参数列表

时间:2012-01-12 02:31:23

标签: bash

我有一个包含这样的字符串:

apple orange pear grapes

我有一个像这样的命令:

eat food [additionalFood [additionalFood [additionalFood...]]

如果我做eat $s,那么它会将整个字符串视为一大食物。如何将字符串分解为可传递的参数?

3 个答案:

答案 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