1

我需要我的 bashscript 将其所有参数放入一个文件中。我尝试使用cat它,因为我需要添加很多行:

#!/bin/sh
cat > /tmp/output << EOF
 I was called with the following parameters:
 "$@"
 or 
 $@
EOF

cat /tmp/output

这导致以下输出

 $./test.sh "dsggdssgd" "dsggdssgd dgdsdsg"
 I was called with the following parameters:
 "dsggdssgd dsggdssgd dgdsdsg"
 or 
 dsggdssgd dsggdssgd dgdsdsg

我不想要这两件事:我需要在命令行上使用的确切引用。我怎样才能做到这一点?我一直认为$@在引用方面做的一切都是正确的。

4

3 回答 3

5

好吧,你是对的,"$@"它的 args 包括每个 arg 中的空格。但是,由于 shell 在执行命令之前会执行引号删除,因此您永远无法知道 args 是如何被引用的(例如,是使用单引号还是双引号,或者是反斜杠还是它们的任何组合——但您不需要知道,因为您应该关心的只是参数)。

放置"$@"在此处的文档中毫无意义,因为您会丢失有关每个 arg 开始和结束位置的信息(它们之间用空格连接)。这是一种查看方式:

$ cat test.sh
#!/bin/sh

printf 'I was called with the following parameters:\n'
printf '"%s"\n' "$@"
$ ./test.sh "dsggdssgd" "dsggdssgd dgdsdsg"
I was called with the following parameters:
"dsggdssgd"
"dsggdssgd dgdsdsg"
于 2013-07-01T14:07:35.690 回答
1

尝试:

#!/bin/bash
for x in "$@"; do echo -ne "\"$x\" "; done; echo
于 2013-07-01T13:38:22.273 回答
0

要查看 Bash 解释了什么,请使用:

bash -x ./script.sh

或将其添加到脚本的开头:

set -x 

您可能希望将其添加到父脚本中。

于 2013-07-01T13:34:33.320 回答