我正在尝试使用变量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 :(得分:4)
首先,让我们了解引用的工作原理。
最简单的引用形式是反斜杠:它可以防止以任何特殊方式解释后续字符,从而允许将其用作文字字符。例如:
# 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
相同,因为a
,b
,c
开头没有特殊意义。您可以将双引号内的每个字符视为字面处理,但以下情况除外:
$
可以启动参数扩展或命令替换。用反斜杠来逃避它直接对待它。
$ foo=3
$ echo "$foo"
3
$ echo "\$foo"
$foo
反引号启动命令替换。用反斜杠来逃避它直接对待它。
$ echo "`pwd`"
/home/me
$ echo "\`pwd\`"
`pwd`
双引号结束带引号的字符串。用反斜杠来逃避它直接对待它。
$ echo "\""
"
因为反斜杠可能是前面三个序列之一的一部分,所以使用反斜杠转义 it 以逐字处理。
$ 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 :(得分:1)
我认为您可能会混淆\
和%
字符。 %
用于输出格式化的变量内容。我认为当\f
是输出^L
(又名ASCII FF)时,转义序列的工作正如所记录的那样。
printf
参数可以用单引号引用。然后你可以在其中使用双引号,它们将成为输出的一部分:
printf '"%x"' 4011 # output: "fab"
与浮点类似:
print '"%f"' 2.2 # output: "2.200000"
\
字符用于其他不可打印字符的转义序列。
有关man printf
格式字符及其含义的完整列表,请参阅%
。