シェルで特殊文字を囲むために一重引用符を使用するときは、「一重引用符」をどのようにエコーしますか?

シェルで特殊文字を囲むために一重引用符を使用するときは、「一重引用符」をどのようにエコーしますか?

今日はシェルチュートリアルを読んでいます。http://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm

それは述べた:

出力したい文字列に一重引用符が表示されている場合は、文字列全体を一重引用符で囲まないでください。

echo 'It\'s Shell Programming'

Centosサーバーでこれを試しましたが、うまくいかなかったので、>より多くの入力を要求しました。

\2つの一重引用符はすべての特殊文字をエスケープ文字を含みますが、自分を除外する一般文字に変換するため、一重引用符構文'内で
一重引用符をどのように表現するのか疑問に思います。'

答え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 Wikipedia

答え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__

シェルが変数として扱うことができるすべての項目はバックスラッシュでエスケープする必要があります。

cat >> its-shell-programing.txt << __EOF__
echo \$It\'s Shell Programming
__EOF__

答え3

あなたはそれを使用することができます:

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

シェルを安全にするために、1行に1つの値行を引用します。

シェルに応じて、次のことを選択することもできます。

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."

関連情報