当使用单引号将特殊字符包装在shell中时,如何回显“单引号”?


26

我今天正在从http://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm阅读Shell教程

其中提到:

如果单引号出现在要输出的字符串中,则不应将整个字符串放在单引号中,而应使用反斜杠()进行如下操作:

echo 'It\'s Shell Programming'

我在centos服务器上尝试了此操作,它不起作用,>提示您提示我输入更多内容。

我很纳闷,因为两个单引号每一个特殊字符转换为普通字符,其中包括逃逸符号\,但不包括本身的'
我应该怎么代表一个单引号'在单引号的词组?


1
为什么不使用echo It\'s Shell Programmingecho "It's Shell Programming"
cuonglm'3

@cuonglm,因为我可能会使用短语像echo Wow, I'm going to have lots of $$$$$$ now

2
因此,您也应该使用双引号,也使用转义$。相似echo Wow, I\'m going to have lots of \$\$\$\$\$\$ now或相似echo Wow, I\'m going to have lots of '$$$$$$' now
cuonglm'3

@cuonglm,是的,我可以做到,而且我知道我该怎么做。但是,我一直在阅读的教程似乎对是否有一种方法可以对单引号内的单引号进行转义充满信心,但是该教程的给定示例无效。所以我想知道有人会知道解决方案。
2015年

1
这个怎么样?echo 'It'"'"'s Shell Programming'。我将其分为3个字符串,第一个和最后一个字符串用单引号引起来,但是中间一个字符串将单引号引起来用双引号引起来。
jcbermu

Answers:


49

本教程是错误的。

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的Wiki


4
还有一个:echo 'It''s Shell Programming'-带有rc_quotes选项集的zsh (还有rc shell)-单引号内的一对单引号表示一个单引号。
米哈尔Politowski

5
我有时会使用q="'"qq='"'使它更清洁。这样就可以了echo "It${q}s ${qq}Shell Programming${qq}"(给定尾随字母,需要使用花括号)。POSIX安全的。外层必须双引号。
亚当·卡兹

1

您可以使用:

sed "s/'"'/&\\&&/g
     s/.*/'"'&'"'/
' <<IN
$arbitrary_value
IN

为了安全地对每行的值行进行外壳引用。

取决于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
}

...至少是无叉子的。


1
我完全不知道您在说什么,除了短语之外printf %q\\n "$arbitrary_value",其他单词都太复杂了。

1

万一有人将单引号和双引号的混合放入文件中,这也可行:

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__
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.