[解決済み] 変数を割り当てただけなのに、echo $variableには別のものが表示される。
質問
以下は
echo $var
がちょうど割り当てられたものとは異なる値を表示することができます。これは、割り当てられた値が "double quoted" か 'single quoted' か unquoted かには関係なく起こります。
シェルに変数を正しく設定させるにはどうしたらよいですか。
アスタリスク
期待される出力は
/* Foobar is free software */
ですが、代わりにファイル名のリストが出力されます。
$ var="/* Foobar is free software */"
$ echo $var
/bin /boot /dev /etc /home /initrd.img /lib /lib64 /media /mnt /opt /proc ...
角括弧
期待値は
[a-z]
ですが、時々一文字で表示されることがあります。
$ var=[a-z]
$ echo $var
c
改行(ニューライン)
期待される値は、別々の行のリストですが、代わりにすべての値が1行にあります!
$ cat file
foo
bar
baz
$ var=$(cat file)
$ echo $var
foo bar baz
複数のスペース
私は慎重に整列されたテーブルのヘッダーを期待しましたが、代わりに複数のスペースが消えるか、1つに折りたたまれています!
$ var=" title | count"
$ echo $var
title | count
タブ
タブで区切られた2つの値を期待しましたが、代わりにスペースで区切られた2つの値が表示されます!
$ var=$'key\tvalue'
$ echo $var
key value
どのように解決するのですか?
上記のすべてのケースで、変数は正しく設定されていますが、正しく読み取られていません! 正しい方法は 二重引用符を使うことです。 を参照することです。 :
echo "$var"
これは、与えられたすべての例で期待される値を与えます。変数の参照は常に引用してください!
なぜですか?
ある変数が 非クォート であれば、そうなります。
-
以下を実行する フィールド分割 ここで、値は空白で複数の単語に分割されます(デフォルト)。
以前は
/* Foobar is free software */
後
/*
,Foobar
,is
,free
,software
,*/
-
これらの単語は、それぞれ パス名展開 が行われ、パターンがマッチするファイルに展開されます。
以前は
/*
後
/bin
,/boot
,/dev
,/etc
,/home
, ... -
最後に、すべての引数はechoに渡され、echoはそれらを書き出します。 を半角スペースで区切って となり
/bin /boot /dev /etc /home Foobar is free software Desktop/ Downloads/
のように、変数の値の代わりに
変数が 引用 となります。
- その値に置き換えられます。
- ステップ2がない。
このため、あなたは 常にすべての変数参照を引用する であるべきなのです。特に単語分割やパス名展開を必要としない限り。このようなツールは シェルチェック のようなツールがあり、上記のすべてのケースで引用符の欠落について警告してくれます。
関連
-
[解決済み】shでJenkinsのステージから他のステージに変数を渡す
-
[解決済み] bash : cd : 引数が多すぎる [閉店].
-
[解決済み] condaのアップデート後、ターミナルのプロンプトから(base)を削除する方法
-
[解決済み] nohupプロセスを終了させる方法を教えてください。
-
[解決済み] bash スクリプトを実行している docker エントリポイントに "permission denied" が表示される。
-
[解決済み] ファイル内の大文字・小文字を区別しない文字列を grep するには?
-
[解決済み] bashでのDiffコマンド
-
[解決済み] IPアドレスのまとめ方
-
[解決済み] Bashのforeachループ
-
[解決済み] IPアドレスだけを取得するには、どのターミナルコマンドを使用すればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] etc/profileでVISIBLE=NOWを設定するのはなぜですか?
-
[解決済み] bash スクリプトの "${BASH_SOURCE[0]}" と $( cd $( dirname "xxx" && pwd )) の意味について
-
[解決済み] sed で二重引用符と単一引用符をエスケープするにはどうしたらいいですか?
-
[解決済み] openstack の google-chrome-stable ubuntu12 パッケージが見つかりません。
-
[解決済み] プロジェクトからすべての .pyc ファイルを削除するにはどうすればよいですか?
-
[解決済み] grepの出力に含まれる重複を削除する
-
解決策:bash: /root/.bashrc: パーミッションが拒否されました
-
[解決済み] condaのアップデート後、ターミナルのプロンプトから(base)を削除する方法
-
[解決済み] Bash - "fi ;;" の使い方は?
-
[解決済み] BashでDo-whileループをエミュレートする