我今天正在阅读 shell 教程http://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm
其中提到:
如果要输出的字符串中出现单引号,则不应将整个字符串放在单引号内,而应在前面使用反斜杠 (),如下所示:
echo 'It\'s Shell Programming'
我在我的 centos 服务器上尝试了这个,它不起作用,>
提示提示我输入更多内容。
我想知道,由于两个单引号将每个特殊字符转换为普通字符,其中包括转义符号\
,但排除其自身,那么'
我应该如何在单引号短语中
表示单个单引号?'
答案1
教程错了。
POSIX说:
单引号内不能出现单引号。
这里有一些替代方案:
echo $'It\'s Shell Programming' # ksh, bash, and zsh only, does not expand variables
echo "It's Shell Programming" # all shells, expands variables
echo 'It'\''s Shell Programming' # all shells, single quote is outside the quotes
echo 'It'"'"'s Shell Programming' # all shells, single quote is inside double quotes
进一步阅读:引言 - Greg 维基百科
答案2
如果其他人将单引号和双引号混合放入文件中,这也有效:
cat > its-shell-programing.txt << __EOF__
echo $'It\'s Shell Programming'
echo "It's Shell Programming"
echo 'It'\''s Shell Programming'
echo 'It'"'"'s Shell Programming'
__EOF__
shell 可能将其视为变量的所有内容都必须用反斜杠转义:
cat >> its-shell-programing.txt << __EOF__
echo \$It\'s Shell Programming
__EOF__
答案3
您可以使用:
sed "s/'"'/&\\&&/g
s/.*/'"'&'"'/
' <<IN
$arbitrary_value
IN
为了安全地 shell 每行引用一个值行。
根据 shell 的不同,您可能还可以选择执行以下操作:
printf %q\\n "$arbitrary_value"
虽然我通常更喜欢这样做:
a=$(alias "a=$arbitrary_value" a); a=${a#*=}
更手动的方法可能如下所示:
sq(){ set \' "$1"
while case $2 in (*\'*) :;;
(*) ! RETURN="$1$2'" ;;esac
do set "$1${2%%\'*}'\''" "${2#*\'}"
done
}
...至少是无叉的。
答案4
echo "He said to me, \"I've seen that.\""
在我看来,这是返回文本的最简单方法:
He said to me, "I've seen that."