2013-07-01 59 views
1

我需要我的bashscript將其所有參數記錄到文件中。我試圖用cat對於這一點,因爲我需要添加很多線路:

#!/bin/sh 
cat > /tmp/output << EOF 
I was called with the following parameters: 
"[email protected]" 
or 
[email protected] 
EOF 

cat /tmp/output 

導致下面的輸出

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

我想這些都不兩兩件事:我需要確切報價這是在命令行中使用的。我怎樣才能做到這一點?我一直認爲[email protected]在報價方面做的一切都是正確的。

+0

這可能幫助:http://stackoverflow.com/q/17238437/802365 –

+0

什麼是你真正的* *目的是什麼? –

+0

我想他是用它來記錄目的。例如'。/ configure'記錄命令行參數。 – anishsane

回答

5

嗯,你是正確的,"[email protected]"有ARGS包括每個ARG空白。但是,由於shell在執行命令前執行了報價刪除,因此永遠不可能知道引用了哪些參數(例如,是使用單引號還是雙引號,還是使用反斜線或其組合 - 但您不需要知道,因爲所有你應該關心的是參數)。

"[email protected]"放置在here-document中是毫無意義的,因爲您丟失了每個arg開始和結束的位置(它們之間以空格連接)的信息。這裏有一個方法,看看眼前這個:

$ cat test.sh 
#!/bin/sh 

printf 'I was called with the following parameters:\n' 
printf '"%s"\n' "[email protected]" 
$ ./test.sh "dsggdssgd" "dsggdssgd dgdsdsg" 
I was called with the following parameters: 
"dsggdssgd" 
"dsggdssgd dgdsdsg" 
+2

+1。與我的回答相比,這裏不需要循環。當然,如果需要,OP可以將''「%s」\ n'轉換爲''「%s」'''。 – anishsane

0

要看看有什麼被Bash解釋,使用方法:

bash -x ./script.sh 

或添加到您的腳本的開頭:

set -x 

你可能想添加這個父腳本。

1

嘗試:

#!/bin/bash 
for x in "[email protected]"; do echo -ne "\"$x\" "; done; echo 
+0

'「$ {@}」'只是不必要的; '「$ @」'會做得很好。此外,你根本不需要它; 'for x'與'$ @「'中的'for x相同。 – michaelb958

+0

你說得對。我用'var =(1 2 3)'測試了代碼並將var作爲變量的循環。在發佈答案期間忘記刪除{}。 – anishsane