我的last question得到了很好的回复。我们的想法是从命令行处理N个输入,将前9个输出保存到变量并创建一个10到前的字符串。
我发现这是最简单的解决方案。
var1="$1"
var2="$2"
var3="$3"
var4="public"
var5="$5"
var6="''"
var7="$7"
var8="$8"
var9="$9"
var10="$(shift 9; IFS=""; echo "$*")"
echo snmptrap $var1 $var2 $var3 $var4 $var5 $var6 $var7 $var8 $var9 "$var10"
snmptrap $var1 $var2 $var3 $var4 $var5 $var6 $var7 $var8 $var9 "$var10"
输出看起来像这样......
./snmptas -v 2c -c "" 9.48.85.57 "" 1.3.6.1.4.1.2.6.201.3 s s ABC DDEF EFFF
snmptrap -v 2c -c public 9.48.85.57 '' 1.3.6.1.4.1.2.6.201.3 s s ABCDDEFEFFF
但我希望这种形式的$ var10
" ABC DDEF EFFF"。
这需要改变。它取消了空间。
var10="$(shift 9; IFS=""; echo "$*")"
如何制作var10 =" ABC DDEF EFFF"?
谢谢
答案 0 :(得分:1)
带回声的子shell在那里并不合适。这样更好:
shift 9
var10="$*"
如果您希望将该值作为值的一部分,则将最后一行更改为:
var10=\""$*"\"
与此无关,我想知道您对var6
的治疗是否符合您的预期。我怀疑这将更接近你的真实目的:
snmptrap $var1 $var2 $var3 $var4 $var5 '' $var7 $var8 $var9 "$var10"
或者这个:
var6=
snmptrap $var1 $var2 $var3 $var4 $var5 "$var6" $var7 $var8 $var9 "$var10"
但是,如果我的猜测是错误的,并且您的原始治疗方法按预期工作,那么请不要理睬,请忽略这些评论。
答案 1 :(得分:0)
要使变量var10包含引号,您需要这样的内容:
shift 9
printf -v "var10" '"%s"' "$*"
而且,如果你想引用所有变量,以便缺少变量,请使用:
#!/bin/bash
set -- -v 2c -c "" 9.48.85.57 "" 1.3.6.1.4.1.2.6.201.3 s s ABC DDEF EFFF
for ((i=1;i<=9;i++)); do
printf -v "var$i" '"%s"' "${!i}"
done
shift 9
printf -v "var10" '"%s"' "$*"
echo snmptrap $var{1..10}
要让脚本读取传递的参数而不是代码中编写的参数,只需注释掉set --
行。
输出将是:
$ ./snmptrap
snmptrap "-v" "2c" "-c" "" "9.48.85.57" "" "1.3.6.1.4.1.2.6.201.3" "s" "s" "ABC DDEF EFFF"
每个参数都有引号意味着将它们用作脚本的输入没有问题。