2017-02-20 185 views
1

我想給printf與變量輸入,需要雙引號。我的輸出需要\ x和\ f文本輸出。bash printf:如何在雙引號內輸出 x和 f?

printf "\x" 

printf "\\x" 

產生錯誤:

./pegrep.in: line 94: printf: missing hex digit for \x 

printf "\f" 

printf "\\f" 

生產什麼都沒有(在一個文本輸出,我相信它會創建^ L)

單引號但適用於X(但不是F)。我試着封閉

printf "...'\\x'..." 

並且得到了與標準雙引號相同的錯誤。也嘗試///無濟於事。

+0

使用雙引號*在格式字符串本身*是不好的做法,缺乏一個非常有說服力的理由。一般來說,格式字符串應該是一個常量,任何替換都應該被參數化。 –

回答

3

首先,讓我們瞭解如何引用作品。

最簡單的引用形式是反斜槓:它可以防止以任何特殊方式解釋下列字符,從而允許將其用作文字字符。例如:

# Two arguments to printf 
$ printf '%s\n' a b 
a 
b 
# One three-character argument to printf 
printf '%s\n' a\ b 
a b 

雙引號相當於逃脫的每一個字符包含在其中:"a b c"相當於\a\ \b\ \c,這是一樣的a\ b\ c因爲abc沒有特殊的意義,開始與。爲被字面上治療,但下列情況除外你能想到的雙引號內的每個字符:

  1. $可以啓動參數擴展或命令替換。用反斜槓將其轉義處理。

    $ foo=3 
    $ echo "$foo" 
    3 
    $ echo "\$foo" 
    $foo 
    
  2. 甲反引號開始命令替換。用反斜槓將其轉義處理。

    $ echo "`pwd`" 
    /home/me 
    $ echo "\`pwd\`" 
    `pwd` 
    
  3. 雙引號結尾引用的字符串。用反斜槓將其轉義處理。

    $ echo "\"" 
    " 
    
  4. 由於反斜槓可能是前三個序列之一的一部分,逃生用反斜線治療一種字面。

    $ echo "\\" 
    \ 
    

單引號,一切都從字面上治療,包括任何使用反斜槓的。 (這樣的後果之一是,它是不可能把一個單引號在單引號字符串,因爲它總是會終止這樣的字符串。)

$ echo '\' 
\ 

一旦你瞭解報價,接下來您需要要意識到printf本身可以處理它在第一個參數中看到的任何反斜槓。

$ printf 'a\x20b\n' # a, space (ASCII 0x20), b, newline 
a b 

爲了確保一個字符串字面印刷無論什麼字符都存在,使用%s格式說明,並通過您的字符串作爲第二個參數:

$ printf '\x41\n' 
A 
$ printf '%s\n' '\x41' 
\x41 
1

我想你可能會混淆\%字符。 %用於輸出格式化的變量內容。我覺得這個時候\f是輸出^L(又名ASCII FF)是轉義序列擔任記錄。

printf參數可以用單引號標註。然後你可以使用在它雙引號,他們將輸出的一部分:

printf '"%x"' 4011 # output: "fab" 

同樣,對於浮點:

print '"%f"' 2.2 # output: "2.200000" 

\字符是的,否則不可打印的字符轉義序列。

%格式字符及其含義的完整列表,請參閱man printf