将除first之外的所有参数添加到字符串中

时间:2015-09-21 08:26:09

标签: string bash sh args

尝试将所有参数解析为一个字符串,但我的代码只给出了我无法找到i的错误:

test: line 3: =: command not found
test: line 7: [i: command not found
test: line 7: [i: command not found
test: line 7: [i: command not found
test: line 7: [i: command not found
test: line 7: [i: command not found

代码吼叫

#!/bin/sh

$msg=""

for i in $@
do
if [i -gt 1]; then
    msg="$msg $i"
fi
done

编辑:thx获得所有帮助,让它发挥作用。如果有人感兴趣,我的最终解决方案:

#!/bin/sh

args=""
for i in "${@:2}"
do
    args="$args $i"
done

3 个答案:

答案 0 :(得分:3)

您的特定错误消息显示为:

  • 分配给变量不是使用$中的$msg=""字符,而是使用msg="";以及

  • [实际上是一个命令,应该通过空格与其他单词分开,这样shell就不会认为你试图执行某些神话[i命令。

但是,您还有其他一些问题。首先,需要使用i获取$i的值,而不只是i。单独使用i将会出现以下错误:

-bash: [: i: integer expression expected

因为i本身不是数值。

其次,i$i都不是索引,您可以将其与1进行比较,因此您的$i -gt 1表达式将无效。单词$i将扩展为参数的,而不是其索引。

但是,如果你真的想处理你的参数列表的第一个元素,bash有一些非常类似C的结构,这将使你的生活更轻松:

for ((i = 2; i <= $#; i++)) ; do   # From two to argc inclusive.
    echo Processing ${!i}
done

使用参数hello my name is pax运行它将导致:

Processing my
Processing name
Processing is
Processing pax

为了构造包含这些参数的字符串,您可以使用类似:

的内容
msg="$2"                           # Second arg (or blank if none).
for ((i = 3; i <= $#; i++)) ; do   # Append all other args.
    msg="$msg ${!i}"
done

会给你(与上面相同的论点):

[my name is pax]

虽然,在这种情况下,有一个更简单的方法,根本不涉及任何(显式)循环:

msg="${@:2}"

答案 1 :(得分:2)

您实际上并不需要为特定输出设置循环(假设单个字符串实际上是正确的输出):

args="${@:2}"  # Use @ instead of * to avoid IFS-based surprises

但是,如果您计划稍后迭代参数,则使用扁平字符串是错误的方法。你应该使用一个数组:

args=( "${@:2}" )

答案 2 :(得分:1)

[只是(或多或少)test的别名,因此您应该像常规命令一样使用它。我想说的是,你需要[之前和之后的空格:

if [ $i -gt 1 ]; then

您还忘记了$条款中i之前的if