将除第一个参数之外的所有参数添加到字符串

Add all arguments except first to a string

试图将所有参数解析为一个字符串,但我的代码只给我错误,它找不到 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

编辑:感谢所有帮助,让它工作。如果有人感兴趣,我的最终解决方案是:

#!/bin/sh

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

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

if [ $i -gt 1 ]; then

您还忘记了 if 子句中 i 之前的 $

显示您的具体错误消息是因为:

  • 赋值给一个变量并不是像 $msg="" 中那样使用 $ 字符完成的,相反你应该使用 msg="";和

  • [实际上是一个命令,应该和其他单词用白色space分开,所以shell 不认为你在尝试执行一些神秘的 [i 命令。

但是,您还有其他一些问题。首先是i的值需要用$i获取,而不仅仅是i。单独使用 i 会给你一个错误:

-bash: [: i: integer expression expected

因为i本身不是数值

其次,i$i 都不会成为可以与 1 进行比较的 index,因此您的 $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=""                           # 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}"

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

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

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

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