この質問は、ある変数の内容全体を別の変数に割り当てることに関するものです。
変数が使用されていません使用されています(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 \
ボーンのようなシェルで(バグを忘れた場合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"')
\*
それはずっと前に修正されました。