web-dev-qa-db-ja.com

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

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

それが言及している:

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

echo 'It\'s Shell Programming'

私のcentosサーバーでこれを試してみましたが、機能しません。>は、さらに入力するように促すメッセージを表示します。

2つの単一引用符がすべての特殊文字を通常の文字に変換するため、エスケープシンボル\を含め、それ自体を除外して'
単一引用符で単一引用符'をどのように表す必要がありますか?

28
Zen

チュートリアルが間違っています。

[〜#〜] 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

さらに読む: 引用-グレッグのウィキ

51
Mikel

他の誰かが一重引用符と二重引用符を混在させてファイルに追加した場合、これも機能します。

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__
1
alexh

以下を使用できます。

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

シェルを安全にするには、値行を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
}

...少なくとも、フォークは不要です。

1
mikeserv