[解決済み] X""で空の文字列をテストする 重複] [重複
質問
Bashで空文字列をテストできることは知っています。
-z
のようにします。
if [[ -z $myvar ]]; then do_stuff; fi
のように書かれているコードをよく見かけますが、これはどうなんでしょうか?
if [[ X"" = X"$myvar" ]]; then do_stuff; fi
その方法はより移植性が高いのでしょうか?の時代以前からの歴史的な屑なのでしょうか?
-z
? それは POSIX シェル用なのでしょうか (私はこの方法が
bash
)? 私の歴史/移植性のレッスンのための準備。
同じ質問が、Server Fault で
bash変数が空であるかどうかを決定する方法は?
という質問がありましたが、誰も
なぜ
を含むコードが表示されます。
X""
のようなものがあります。
どのように解決するのですか?
根本的に、今はもうずっと過去の時代なので、動作が
test
の動作はより複雑で、異なるシステム間で一様に定義されていませんでした (そのため、移植可能なコードは移植不可能な構造を避けるために注意深く書かなければなりませんでした)。
特に、以前は
test
がシェル組み込みになる前は、別の実行ファイルでした (なお、MacOS X では今でも
/bin/test
と
/bin/[
を実行ファイルとして使用)。 そんな時、書き込み。
if [ -z $variable ]
いつ
$variable
が空だった場合、テストプログラムはそのエイリアスである
[
を3つの引数で呼び出します。
argv[0] = "["
argv[1] = "-z"
argv[2] = "]"
というのは、変数が空なので、展開するものがなかったからです。 つまり、安全なコードの書き方としては
if [ -z "$variable" ]
これは確実に動作し、4つの引数を
test
実行ファイルに 4 つの引数を渡すことで確実に動作します。 確かに、テスト プログラムは何十年もの間、ほとんどのシェルに組み込まれていますが、古い装置はなかなか壊れませんし、さらに昔に学んだ良い習慣も変わりません。
X 接頭辞によって解決された他の問題は、変数に先頭のダッシュが含まれていたり、等号や他の比較演算子が含まれていたりする場合に何が起こるかということでした。 (あまり良くない例ですが) を考えてみましょう。
x="-z"
if [ $x -eq 0 ]
これは、迷子の(誤った)引数による空文字列のテストでしょうか、それとも数字でない最初の引数による数字の等値性テストでしょうか? 1990年頃、POSIXが動作を標準化するまでは、システムによって異なる答えが用意されていました。 そこで、これに対処する安全な方法として
if [ "X$x" = "X0" ]
または(私の経験では、それほど普通ではありませんが、完全に同等です)。
if [ X"$x" = X"0" ]
テストが別の実行ファイルである可能性と結びついた、このようなすべてのエッジケースは、移植可能なシェルコードが、現代のシェルが実際に必要とするよりも大量にダブルクォートをまだ使用しており、X-プレフィックス表記は、誤解されることがないようにするために使用されていたことを意味するものでした。
関連
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み] Swiftで "Index "を "Int "型に変換するには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] LC-3アセンブリ言語で文字列を印刷する (super noob)
-
[解決済み] Scalaにおけるより良い文字列フォーマット
-
[解決済み] golangの[]stringと...stringの違いは何ですか?
-
[解決済み】Scala:文字列のイテラブルを結合する
-
[解決済み] 文字列が有効な整数であるかどうかをテストする
-
[解決済み] Kotlin - 文字列を正しく連結する方法
-
[解決済み] 文字列の最後の4文字を取得する方法は?重複
-
[解決済み] Golangで文字列をint64に変換する
-
[解決済み] Perlで文字列を数値に変換するには?
-
[解決済み] シェルスクリプトの比較で x$VAR = xyes がよく使われるのはなぜですか?