尝试将所有参数解析为一个字符串,但我的代码只给出了我无法找到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
答案 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
。