web-dev-qa-db-ja.com

引用符を使用せずにシェルで1つの変数を別の変数に割り当てる際に問題はありますか?

この質問は、ある変数の内容全体を別の変数に割り当てることに関するものです。

変数が使用されていません使用されていますechoなどに送信されます)

いいえ パラメータ拡張 割り当て中に実行されています。

私の質問はPOSIXシェルのみに関係します(ここでは配列は使用されていません)。

error="You have an error in your input"

newVar="$error"
# vs.
newVar=$error
#         ↑
#         └─This assignment is the question. It doesn't seem that quotes are
#           needed here in order to assign the entire contents of $error to
#           a new variable.

#                 ┌─(But quotes are required when they're used.)
#                 ↓
printf "%s\n" "$error"
# => You have an error in your input
printf "%s\n" "$newVar"
# => You have an error in your input

newVar=$errorを書くだけで見逃している落とし穴はありますか?

更新

$errorの内容に関係なく、エラーをスローしたりデータを操作したりすることなく、同じデータが$newVarに引き継がれるかどうかを知りたいです。

$ error="Test * ${1} \n [!a] [[:punct:]] ./test \t \n \\"
$ newVar=$error
#       ↑
#       └─Does this step ever fail or cause the two variables to differ?
$ echo "$error"
Test *  \n [!a] [[:punct:]] ./test \t \n \
$ echo "$newVar"
Test *  \n [!a] [[:punct:]] ./test \t \n \
5
Caleb Paul

ボーンのようなシェルで(バグを忘れた場合1 いくつかのシェルのいくつかの古い実装では)

var=$otherVar

結構です。スカラー変数に割り当てているので、ここでglob + splitingを実行することはできないため、var="$otherVar"と記述する必要はありません(ただし、引用符はここでは害を及ぼしません)。

例外は次のとおりです。

var=$*

そして:

var=$@

var="$*"のみを使用する必要があります。 var=$@ var=$* var="$@"の最初の文字がスペースでない場合、$IFSの動作はシェルによって異なります。

もちろん、で:

array=("$var")

引用符は必要です。そうでない場合、配列要素には$varの分割+グロブの結果が割り当てられます。

また、次の引用符が必要であることに注意してください。

export var="$otherVar"

多くのシェルがあります(ここでは、単純なコマンドなので、split + globが発生します)。

そしてで:

env var="$otherVar" cmd

または

awk -v var="$otherVar"...

疑わしい場合は、引用符を使用してください。


1zshの一部の古いバージョンでは、shエミュレーションで、ワイルドカード文字の前に円記号が表示されるという問題がありました。

$ (a='\*' exec -a sh zsh-3.1.9 -c 'b=$a; printf "%s\n" "$b"')
*
$ (a='\*' exec -a sh zsh-3.1.9 -c 'b="$a"; printf "%s\n" "$b"')
\*

それはずっと前に修正されました。

12