単一引用符を使用してシェルで特殊文字をラップするときに「単一引用符」をエコーする方法は?


26

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

それが言及している:

出力する文字列内に一重引用符が含まれる場合は、次のようにバックスラッシュ()を使用する前に文字列全体を一重引用符で囲まないでください。

echo 'It\'s Shell Programming'

私はこれをcentosサーバーで試しましたが、うまくいきません>。もっと入力するように促すプロンプトが出ます。

2つの一重引用符がすべての特殊文字を通常の文字に変換するので、エスケープシンボルを含む\が、それ自体を除外するので、 一重引用符で一重引用符を表現するに'
どうすればよいの'だろうか?


1
echo It\'s Shell Programmingまたはを使用しないのはなぜecho "It's Shell Programming"ですか?
cuonglm

@cuonglm、次のようなフレーズを使用する可能性があるためecho Wow, I'm going to have lots of $$$$$$ now
Zen

2
そのため$、二重引用符とエスケープも使用する必要があります。何かecho Wow, I\'m going to have lots of \$\$\$\$\$\$ nowまたはちょうどecho Wow, I\'m going to have lots of '$$$$$$' now
-cuonglm

@cuonglm、はい、私はそれを行うことができます。しかし、私が読んでいるチュートリアルは、単一引用符で囲まれたフレーズの中に単一引用符をエスケープする方法があると確信していますが、与えられたチュートリアルの例は機能しません。だから誰かが解決策を知っているのではないかと思っています。

1
これはどう?echo 'It'"'"'s Shell Programming'。最初と最後を一重引用符で囲んだ3つの文字列として分割しますが、真ん中の文字列は二重引用符で囲まれた一重引用符を持っています。
jcbermu

回答:


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's Wiki


4
もう1つ:echo 'It''s Shell Programming'- rc_quotesオプションを設定したzsh (およびrcシェルも)-単一引用符内の単一引用符のペアは、単一単一引用符を表します。
ミチャウポリトウスキ

5
私は時々使用q="'"してqq='"'、このクリーナーを作ること。これにより、許可されますecho "It${q}s ${qq}Shell Programming${qq}"(末尾の文字には中括弧が必要です)。POSIXセーフ。外層は二重引用符で囲む必要があります。
アダム・カッツ

1

次を使用できます。

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

行ごとに値行を安全にシェル引用するため。

シェルによっては、次のオプションもあります。

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__

バックスラッシュでエスケープする必要がありますが、シェルが変数として見るすべてのもの:

cat >> its-shell-programing.txt << __EOF__
echo \$It\'s Shell Programming
__EOF__
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.