我需要我的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
我不想要这两件事:我需要在命令行上使用的确切引用。我怎样才能做到这一点?我一直认为$@
在报价方面做的一切都是正确的。
答案 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
您可能希望在父脚本上添加此内容。