字符串连接bash中的空格并放置引号

时间:2016-05-25 05:44:17

标签: string bash whitespace quote

我的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"?

谢谢

2 个答案:

答案 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"

每个参数都有引号意味着将它们用作脚本的输入没有问题。