在shell中使用单引号包裹特殊字符时如何回显`单引号`?

在shell中使用单引号包裹特殊字符时如何回显`单引号`?

我今天正在阅读 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."

相关内容