2

在下面的代码中,我希望将输出pyfg()完全按照回显(之间的空格-htnscrl按字面意思解释,而不是空格,按aoeu())传递给aoeu(). 当然,问题在于 in aoeu(), $1is -htns, $2is crl, and $3,在这种情况下我根本不想要 is 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

需要明确的是,我确实明白为什么我的代码不起作用,但我不太确定的是如何让它做我想做的事情。

编辑:

#!/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.

4

2 回答 2

2

正确引用的关键在于理解发生了什么。

例如,echo "-htns crl" "qjkx"它只会将一个字节流打印到它的标准输出,所以它会-htns crl qjkx在最后。-htns crl分组更紧密的信息比qjkx丢失的信息更紧密。

为了避免这种损失,您可以使用printf "%q"

pyfg() {
  printf "%q %q" "-htns crl" "qjkx"
}

这将生成带引号的输出:-htns\ crl qjkx这对 shell 意味着相同"-htns crl" "qjkx"(无论空格是用反斜杠转义还是用双引号引起来都没有区别)。

下一个方面是使用 将$()一个程序的输出传递给下一个程序。

典型的方法是将其放在双引号中:

aoeu "$(pyfg)"

通过这种方式,所有内容都无需解释即可通过,这在大多数情况下是可取的。

但是,在您的情况下,您可能希望将pyfg引用的输出而不是引用的输出pyfg; 注意重要的区别:第一个表示pyfg产生引用的输出(如上所示),第二个表示pyfg产生稍后引用的输出。pyfg如果输出已经丢失了哪些部分属于一起的信息,则第二个没有帮助。

如果您现在只留下双引号,不幸的是输出只会在空格处拆分(即 的第一个字符$IFS),即使这个空格是用反斜杠转义的。因此,相反,您需要eval在这种情况下强制 shell$(pyfg)使用正常的 shell 评估机制来解释 的值:

eval aoeu "$(pyfg)"
于 2013-11-06T12:23:53.650 回答
1

编辑:这有效

#!/bin/bash
# pass_space_function.sh

aoeu() {
echo $1 x $2
}

pyfg() {
echo "'-htns crl' 'qjkx'"
}


eval aoeu $(pyfg)
于 2013-11-06T12:33:44.923 回答