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