所以我有一个bash脚本,它需要接受任意数量的命令行参数并将它们放入单个字符串中
用户将键入的内容示例:
give <environment> <email> <any number of integers separated by spaces>
give testing stuff@things.com 1 2 3 4 5
我想获取从 $3 到 $# 的所有参数,并将它们连接成一个字符串。
我现在(可能很糟糕)的解决方案是
if [ $# -gt 3 ]
then
env="env="$1
email="email="$2
entList=""
for i in {3..$#}
do
if [ $i -eq 3 ]
then
entList=$3
shift
fi;
if [ $i -gt 3 ]
then
entList=$entList","$3
shift
fi;
done
fi;
我处理只有三个参数的情况略有不同,而且那个参数工作正常。
给定示例give testing stuff@things.com 1 2 3 4 5
$entList
的最终值应为:1,2,3,4,5
现在,当我运行它时,我收到以下错误:
/usr/local/bin/ngive.sh: line 29: [: {3..5}: integer expression expected
/usr/local/bin/ngive.sh: line 34: [: {3..5}: integer expression expected
第 29 行和第 34 行是:
line 29: if [ $i -eq 3 ]
line 34: if [ $i -gt 3 ]
任何帮助将不胜感激。
你走在正确的轨道上。 这是我的建议:
if [ $# -ge 3 ]; then
env="$1"
email="$2"
entlist="$3"
while shift && [ -n "$3" ]; do
entlist="${entlist},$3"
done
echo "entlist=$entlist"
else
echo "Arguments: $*"
fi
请注意,变量应始终放在引号内。 我不确定你为什么要设置env=env=$1
,但我怀疑如果你想稍后回收该值,你应该以编程方式进行,而不是像评估语句一样计算变量,以防万一这是你的计划。
使用子数组跳过前三个参数:
all=( ${@} )
IFS=','
threeplus="${all[*]:3}"
您收到这些错误消息的原因是:
for i in {3..$#}
大括号展开在参数展开之前执行,因此以下if
语句的计算结果为:
if [ {3..$#} -eq 3 ]
这是无效的。
将 for
语句更改为使用 C 样式:
for ((i = 3; i <= $#; i++))
使用此样式进行整数比较:
if (( $# > 3 ))
和
if (( i == 3 ))
和
if (( i > 3 ))
将您的参数放在引号内:
env="env=$1"
email="email=$2"
和
entList="$entList,$3"
尽管引号不是必需的,因为单词拆分不是在赋值的右侧执行的,并且您不会分配特殊字符,例如空格、分号、管道等。