引用符なしでシェル内の1つの変数を別の変数に割り当てるのに問題がありますか? [コピー]

引用符なしでシェル内の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 \

ベストアンサー1

Bourneに似たシェル(一部のシェルの以前の実装でバグ1を忘れた場合)

var=$otherVar

とても良いです。スカラー変数に割り当てるので、ここではglob + splittingを使用できないため、作成する必要はありませんvar="$otherVar"(ここでは引用符は問題ではありませんが)。

例外は次のとおりです。

var=$*

そして:

var=$@

.は、最初の文字が空白でない場合にのみ使用する必要がありますvar="$*"var=$@ var=$* var="$@"$IFS

もちろん次のようになります。

array=("$var")

引用符が必要です。それ以外の場合、配列要素は分割+グロービングの結果として割り当てられます$var

また、次の引用符が必要です。

export var="$otherVar"

多くのシェルがあります(ここには単純なコマンドがあるため、分割+グローブが発生します)。

そして:

env var="$otherVar" cmd

または

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

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


一部の以前のバージョンでは、シミュレーションzsh時にワイルドカード文字の前にバックスラッシュの問題がありました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"')
\*

これはずっと前に解決されました。

おすすめ記事