• 締切済み

bash での空文字判定?

文字列が空文字かどうか判定する場合(?)に、よく以下のような記述を見ます if [ "x${str}" = "x" ]; then echo "str is empty." fi なぜ、"${str}" = "" ではないのでしょうか?

みんなの回答

  • entree
  • ベストアンサー率55% (405/735)
回答No.2

$strの内容がオプションと勘違いされないようにするためと思われます。 if [ "x${str}" = "x" ]; then これは、下記と同義です。 if test "x${str}" = "x"; then ifの中はコマンドで、ここではtestというコマンドです。 この部分だけ取り出してみましょう。 test "x${str}" = "x" testコマンドに対する 第1引数は "x${str}" 第2引数は = 第3引数は x です。 もし、$strが -f だったとしましょう。 xありの場合は、test x-f = x です。 xなしの場合は、test -f = x です。 後者(xなし)の場合は、 オプション -f 第1引数は = 第2引数は x とも読み取れなくないですよね? このような誤解釈を防ぐために、xを付けているのでしょう。 「x-f」はオプションにはなりませんので。

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

空文字列が使えない他の言語からの混入です。そういう言語だと、空かどうかの判断に、 if x$str = x のようにしないといけない。 shの場合は、お書きのように x は不要です。 そもそも、「空文字列かどうか」の判断であれば、 if [ -z "${str}" ] で十分です。 もしかすると、ごく初期のshだと空文字列をうまく使えなかったのかもしれませんが、少なくとも30年前のUnixのshは大丈夫でした。

関連するQ&A

  • bash ファイルなし判定

    現在bash scriptにおいてファイル存在判定を下記のように しています。 if [ -s "tmp.txt" ]; then (dummy=1) else echo " no [tmp.txt] file" exit fi -sでファイルがある場合のelseとしていています。 if文で直接ファイルが"ない"という判定はどのように 記載するのでしょうか?

  • 文字列がNULLか空文字列かの判定

    Visual C++で、Cのプログラムを作成しているものです。(OS:WinNT 4.0) 文字列の扱いについて、質問します。 関数 int func(char *str) があると仮定します。 パラメータとして、strは以下のような状態あるとします。 (strは関数が呼ばれる前にcalloc()で領域確保済み)  シンボル名 値  str      0x00000001 "" 上記の状態で、strがNULLか空文字列("")であることを条件式にしたいのですが、str == NULL は偽となり、strcmp(str, "") を使用すると異常終了します。 どうしたらよいのでしょうか。アドバイスをお願いします。

  • 全角文字の判定

    現在C言語を勉強しております。 そこで、キーボードから入力された文字列のチェックを行う関数を作成したいのですが、実装方法が分かりません・・・。 以下に仕様と私の作成したソースを貼ります。 【許可する文字】は、 全角のひらがな 全角の英語(大文字も小文字もOK) 全角の数字 です。 チェックする関数を作成したいのですが、以下ではうまくいかず・・・ 教えてくださいorz 比較の仕方がおかしいでしょうか? 関数は、引数として渡された文字列に許可以外の文字が含まれている場合は1を、そうでなければ0を返す、という仕様にしたいです。 int checkName(char *str) { int i; for(i = 0; str[i] != '\n'; i++){ /* 奇数バイトをチェック */ if(str[i] == 0x82){ i++; /* ひらがなの場合 */ if(str[i] >= 0xa0 && str[i] <= 0xf1) printf("ひらがな\n"); return 0; /* 英語(大文字)の場合 */ if(str[i] >= 0x60 && str[i] <= 0x79) printf("英語大\n"); return 0; /* 英語(小文字)の場合 */ if(str[i] >= 0x81 && str[i] <= 0x9a) printf("英語小\n"); return 0; /* 数字の場合 */ if(str[i] >= 0x50 && str[i] <= 0x58) printf("数字\n"); return 0; } return 1; } return 0; } 以上、よろしくお願いいたします。

  • 空文字列の判断方法

    お世話になっています。 空文字列を判断させる方法について教えて下さい。 下記のように、If分を作成しています。 ============================== If rs("USER") = "" Then Response.write "有効" Else Response.write "無効" End If ============================== これだと、空文字列をうまく判断してくれず、結果がすべて"無効"になってしまいます。rs("DEL_FLAG") = ""をrs("DEL_FLAG") = Nullにしても駄目でした。 空文字列を判断させるには、どのように記述したらよいでしょうか? どうしても空文字列を判断させる必要があります。 よろしくお願い致します。

  • 文字列で渡された式

    質問です。 タイトルのままですが文字列で渡された式で 処理を決定させることはできるのでしょうか? たとえば ============================ dim str as string = "10 > 5" if strの文字列判定 then msgbox("TRUE") else msgbox("FALSE") end if ============================

  • 長さ1の空文字列?

    タイトルの通り、長さ1の空文字列で困っています。 現在、Linux、Apache、MySQL、PHPを使って3階層アプリケーションを作っています。 予めMySQLでテーブルの形を決めておいて、CSVからデータを読み込ませておき、 PHPでSQL文を実行してレコードを取得することで、それらをユーザに表示という感じです。 複数あるカラムのうち、空文字列(CSV上でブランクだったもの)は表示させたくないので、 PHPで「 if(カラム=="")~ 」のように比較することで、空文字列だけ避けるつもりでした。 しかし上手くいかなかったので、strlen()で調べて見たところ、返り値が1でした。 本来は空文字列に対してstrlen()は0或いはfalseの返り値を返しますよね。 is_empty()でも空データ扱いにならず、当然NULLの扱いでもありません。 そのため、実データとの区別が出来ずに困っています。 何故、空文字列のカラムを除外したいかというと、 DB上のユニークなレコードを検索したいからです。 select * from where カラム='データ' and カラム='データ'… という風に。 「カラム=''」としてしまうと検索に引っかからなくなってしまいます。 どうすればよいでしょうか。 以下はそれぞれのバージョンです。 MySQL:5.0.95 PHP:5.1.6 Linux:RHEL5 Apache:2.2.3

    • ベストアンサー
    • PHP
  • VBAで配列のNULL判定

    VBAで下記のように配列に設定したNULL値を判定しようとしました。 Dim str() ReDim Preserve str(2) str(0) = "aaa" str(1) = Null str(2) = "bbb" 以下(1)、(2)の分岐処理ではNullと判定されませんでした。 どのように判定すれば良いでしょうか? (1) If str(1) = Null Then Debug.Print "Null値です" End If (2) If str(1) = "" Then Debug.Print "Null値です" End If

  • セルが空か0か

    VBでプログラミングをしているのですが、あるセルが空かどうかを調べるために If Cells(0,0)=Empty Then 等という風に書いたらセルA1が0と入力されているときもThen以下が処理されてしまいます、セルA1が0のときと空のときの処理を分けたいのですがどうすればいいか教えてください。

  • 文字列比較の演算子

    Perl の世界から PHP にやってまいりました。 Perl では、文字列の比較には専用の演算子がありまして、 str1 eq str2 とすると、二つの文字列が同値かどうか調べられますが、PHP にはこのような演算子はないのでしょうか? www.php.net のマニュアルを見ても、そのような演算子がありません。 == 演算子が使えるものかと <?php $str1 = "this is string" ; $str2 = "this is string" if( $str1 == $str2 ) { echo "two string is same" ; } ?> などを試してみるとうまくいくようですが、www.php.net のマニュアルには「文字列を数値化して比較する」と書いてあり、本当に文字列比較が出来るか確信がもてず…。 結局、文字列を比較したいときには strcmp を呼び出していますが、これは PHP 的には正しいのでしょうか?

    • ベストアンサー
    • PHP
  • Kshでエラー(no closing quote):原因わかりません

    下記のようなファイル管理シェルをLinuxで作っているのですが、 test.sh[42]: no closing quote というエラーがでて解決できません。 何が原因なのでしょうか。どなたかご教授ください。宜しくお願い致します。 #!/bin/ksh #KAKUNIN_DATEから更新されているファイルをリスト KAKUNIN_DATE="10 Jul" #これを随時更新 TODAY=`date +"%x"` TODAY_YMD=`date +"%j"` START_YMD=`date --date="${KAKUNIN_DATE}" +"%j"` let n=TODAY_YMD-START_YMD #対象ディレクトリ CHK_DIR=$1 if [[ -d $CHK_DIR ]];then continue else echo "Not Dir:$CHK_DIR" exit fi #検索文字列 CHK_STR=$2 if [[ $CHK_STR = "" ]];then echo "Pls set check-string" exit fi #ファイル形式 NAME_STR=$3 if [[ $NAME_STR = "" ]];then echo "Pls set file type(if all then \"*\")" exit fi ######## メイン echo "-------------------------------------------------" echo "調査日:$TODAY 検索文字列:$CHK_STR 調査:$CHK_DIR 形式:$NAME_STR - $KAKUNIN_DATE から今日まで($n日内)に更新されたファイル" echo "ヒット,サイズ,更新日,ファイル名" find $CHK_DIR -name "$NAME_STR" -type f -mtime -$n -print| while read StrLine do if [[ `cat $StrLine | grep $CHK_STR` = "" ]];then echo `ls -l $StrLine | awk '{print 0","$5","$6,$7,$8","$9}'` else echo `ls -l $StrLine | awk '{print 1","$5","$6,$7,$8","$9}'` fi done