默认情况下,Ubuntu(13.04)中的Bash似乎有这个quote
函数:
quote ()
{
local quoted=${1//\'/\'\\\'\'};
printf "'%s'" "$quoted"
}
此函数应始终返回其第一个参数的正确shell转义版本。
是否有任何输入字符串会破坏此功能(即返回一个不能用于shell输入的字符串)?
示例:
quote "A string's but a string."
'A string'\''s but a string.'
quote "A newline *doesn't*
seem to break anything..."
'A newline *doesn'\''t*
seem to break anything...'
答案 0 :(得分:1)
它似乎是"防弹"。
shell中单引号的项目绝对是单引号之间的任何内容,而不是单引号。通过使用终止一个引用的序列'\''
,然后反斜杠引用引号,然后重新开始新的引用,可以伪引入单引号。
这个替换就是函数所做的全部。
该函数的输出是单引号语法,表示输入字符串。
该功能甚至击败了" process-substitution-swallows-trailing-newlines"问题。
通常,如果你有一些函数或命令输出多行,后跟一个或多个空行,然后用进程替换捕获它,如下所示:
FOO=$(command)
尾随的空行消失了。由于quote
的输出包装在单引号中,因此字符串中的尾随换行符受到保护,允许此操作:
FOO=$("a
b
c
")
echo "$FOO"
'a
b
c
'
显然,quote
的输出应为eval
- ed,quote
确保此eval
的结果是{{1}的原始参数没有任何意外的扩展,分裂或剥离空白。