在下面的代码中,我希望pyfg()
的输出完全按照回显(即,-htns
和crl
之间的空格从字面上解释,而不是aoeu()
}到aoeu()
的空白。当然,问题在于aoeu()
,$1
是-htns
,$2
是crl
,$3
,我不是在这种情况下,我想要的是qjkx
。我知道这个例子是完全无用的,但是我正在尝试应用的实际应用程序调用外部程序代替下面的aoeu()
,所以我确实需要某些东西就像是什么下方。
#!/bin/bash
# pass_space_function.sh
aoeu() {
echo "$1" "$2"
}
pyfg() {
echo "-htns crl" "qjkx"
}
aoeu $(pyfg)
我运行上述输出:
$ ./pass_space_function.sh
-htns crl
我想要的输出是:
$ ./pass_space_function.sh
-htns crl qjkx
要明确的是,我确实理解为什么我的代码不能正常工作,但我不确定的是如何让它做我想要它做的事情。< / p>
编辑:
#!/bin/bash
aoeu() {
echo 1:"$1" 2:"$2" 3:"$3"
}
pyfg() {
# These variables might be user-provided.
wvz="/usr/lib/scarychacacters_\"@#$:%^&:*(){}[]; a o ;u ;::e i y f.so.4"
bm="/space space space"
snt="/var/cache/normalpath"
printf "%q %q %q" "$wvz" "$bm" "$snt"
}
aoeu $(pyfg)
该代码为我返回1:/usr/lib/scarychacacters_\"@#\$:%\^\&:\*\(\)\{\}\[\]\;\ 2:a\ 3:o\
。它显然在$wvz
的空白处分裂。
答案 0 :(得分:2)
纠正引用的关键在于理解会发生什么。
例如,echo "-htns crl" "qjkx"
只会将一个字节流打印到其标准输出,因此最后它只是-htns crl qjkx
。 <{1}}比-htns crl
更紧密地分组的信息将丢失。
为避免这种损失,您可以使用qjkx
:
printf "%q"
这将生成带引号的输出:pyfg() {
printf "%q %q" "-htns crl" "qjkx"
}
,这意味着shell与-htns\ crl qjkx
相同(无论空格是用反斜杠转义还是引用双引号都没有区别)。
下一个方面是使用"-htns crl" "qjkx"
将一个程序的输出传递给下一个程序。
典型的方法是将它放在双引号中:
$()
这样一切都在没有解释的情况下通过,这在大多数情况下都是可取的。
但是,在您的情况下,您可能希望引用aoeu "$(pyfg)"
的输出,而不是引用pyfg
的输出;注意重要的区别:第一个意味着pyfg
产生引用输出(如上所示),第二个意味着pyfg
产生输出,后来引用。如果pyfg
的输出已经丢失了哪些部分属于一起的信息,则第二个没有帮助。
如果你现在只是放弃双引号,不幸的是输出会在空格(即pyfg
的第一个字符)处被分割,即使这个空格是用反斜杠转义的。因此,在这种情况下,您需要使用$IFS
来强制shell使用正常的shell评估机制来解释eval
的值:
$(pyfg)
答案 1 :(得分:1)
编辑:这有效
#!/bin/bash
# pass_space_function.sh
aoeu() {
echo $1 x $2
}
pyfg() {
echo "'-htns crl' 'qjkx'"
}
eval aoeu $(pyfg)