使用“$ @”正确引用文件中的所有参数

时间:2013-07-01 13:26:58

标签: shell unix

我需要我的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

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

3 个答案:

答案 0 :(得分:5)

嗯,你是对的"$@"有args,包括每个arg中的空格。但是,由于shell在执行命令之前执行 quote removal ,您永远无法知道引用args的确切程度(例如,无论是单引号还是双引号,还是反斜杠或其任何组合 - 但您不应该我们需要知道,因为所有你应该关心的是这个论点。

"$@"放置在here-document中毫无意义,因为您丢失了每个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"

答案 1 :(得分:1)

尝试:

#!/bin/bash
for x in "$@"; do echo -ne "\"$x\" "; done; echo

答案 2 :(得分:0)

要了解Bash解释的内容,请使用:

bash -x ./script.sh

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

set -x 

您可能希望在父脚本上添加此内容。