2012-01-28 50 views
11

的printf%Q應該引用的字符串。但是,執行到腳本中時,會刪除空格。

此命令:

printf %q "hello world" 

輸出:

hello\ world 

這是正確的。

這個腳本:

#!/bin/bash 

str="hello world" 
printf %q $str 

輸出:

helloworld 

這是不對的。

如果確實需要這樣的行爲,那麼在腳本中用什麼替代方法來引用包含任何字符的字符串,以便可以通過被調用的程序將其翻譯回原來的位置?

謝謝。

軟件:GNU的bash,版本4.1.5(1)-release(1486-PC-Linux的GNU)

編輯:解決了,謝謝。

+3

刪除了「解決」前綴的標題你帖子。在StackOverflow.com中,您不會將問題標記爲已解決的問題,只需在「已解決」的前面加上標題即可接受答案,或者發佈自己的答案,並通過單擊接近工作答案的投票按鈕下方的勾號接受答案爲你。 – 2012-01-28 12:48:39

回答

34

你應該使用:

printf %q "$str" 

例子:

[email protected]:~$ cat a.sh 
#!/bin/bash 

str="hello world" 
printf %q "$str" 
[email protected]:~$ ./a.sh 
hello\ world 

當您運行printf %q $str,外殼它擴展爲:

printf %q hello world 

所以,琴絃helloworld是作爲兩個獨立的參數提供給printf命令並且它並排打印兩個參數。

但是,當你運行printf %q "$str",外殼它擴展爲:

printf %q "hello world" 

在這種情況下,該字符串hello world作爲一個參數傳遞給printf命令提供。這是你想要的。

這裏是你可以用這些概念來發揮實驗:

[email protected]:~$ showargs() { echo "COUNT: $#"; printf "ARG: %s\n" "[email protected]"; } 
[email protected]:~$ showargs hello world 
COUNT: 2 
ARG: hello 
ARG: world 
[email protected]:~$ showargs "hello world" 
COUNT: 1 
ARG: hello world 
[email protected]:~$ showargs "hello world" "bye world" 
COUNT: 2 
ARG: hello world 
ARG: bye world 
[email protected]:~$ str="hello world" 
[email protected]:~$ showargs $str 
COUNT: 2 
ARG: hello 
ARG: world 
[email protected]ifty:~$ showargs "$str" 
COUNT: 1 
ARG: hello world 
+0

我在手冊頁中看不到任何對q是有效格式參數的引用。有人可以解釋爲什麼%q有效嗎?它是否被棄用,現在有一個新的首選格式參數?我沒有看到描述此功能的手冊頁中的任何內容。 – 2012-10-23 17:19:44

+0

從'help printf'的輸出 - '%q \t引用參數的方式可以重複用作shell輸入。 – 2012-10-27 12:16:41

+1

@AnthonyDiSanti,這是來自Bash,所以你可以在Bash shell的'man bash'或'help printf'中找到它。也許你正在看'man 1 printf'或'man 3 printf'? '%q'不適用於這些。 – 2015-11-15 22:21:57

1

嘗試

printf %q "${str}" 

在您的腳本。

0

這對我有用。滿足這些要求

  1. 接受任意輸入可能包括shell特殊字符
  2. 不輸出轉義字符的「\」
#! /bin/bash 

FOO='myTest3$; t%^&;frog now! and *()"' 

FOO=`printf "%q" "$FOO"`      # Has \ chars 
echo $FOO 

# Eat all the \ chars 
FOO=$(printf "%q" "$FOO" | sed "s/\\\\//g")  # Strip \ chars 

echo $FOO 
+0

因此,如果我在escape命令之前回顯$ FOO,則輸出與最終回顯完全相同。所以看起來你正在逃避你逃脫的字符串,在這種情況下逃避它的意義何在? (至少在這裏顯示的上下文中) – 2014-09-12 15:20:45