
以下のシェルスクリプトで、
#!/bin/sh
ls texistdir 2> /dev/null
ret=$?
[ "$ret" -eq "0" ] || echo "error: $ret"
でtexistdirが存在する場合、
上の場合、$retが数値の0で、"$ret"で文字列の0に変換されてイコールが成立すると思うのですが、
また、
[ $ret -eq 0 ]
の場合は、両方とも数値なので条件が成立すると思うのですが、
[ "$ret" -eq 0 ]
や
[ $ret -eq "0" ]
も条件が成立しているようなのですが、
この書き方では、数値と文字列は区別されないと理解して良いのでしょうか?
No.1ベストアンサー
- 回答日時:
シェルスクリプトは仕組みとして、文字列だけしか扱えないので、区別などしようがありません。
$? や $ret などは、パラメーター展開された文字列です
引用符で囲ったものは、クォート除去された文字列です
囲ってないものは、単語分割された複数の文字列です
test コマンドにとっては 0 も "0" も $ret も "$ret" も、パラメーター展開やクォート除去された文字列として受け取ることになります。
例)
test $ret -eq "0"
test, $ret, -eq, "0" ← 単語分割
test, 0, -eq, "0" ← パラメーター展開
test, 0, -eq, 0 ← クォート除去
→ /usr/bin/test の引数として [ "test", "0", "-eq", "0" ] が渡される
No.2
- 回答日時:
$? は文字列です。
詳しく言うと、直前のコマンドのリターンコードの数値を10進数表現の文字列に変換した物です。シェルの場合、目で見える物はずべて文字列です。
「0は数値で"0"は文字列」というのは多くのプログラミング言語では正しいのですが、シェルの場合はどちらも文字列です。" " ' ' のような引用符はシェルからコマンドに渡る時に取り除かれますので、
[ $ret -eq 0 ] [ "$ret" -eq 0 ] [ $ret -eq "0" ] [ "$ret" -eq "0" ] はどれもtestコマンドに渡る時には、[ 0 -eq 0 ] となっており、同じです。
A=1
let A=A+2
echo $A
とすると3が表示されます。「この場合はAは数値だろ」と思うかもしれませんが、let A=A+2 は、Aの中身の文字列を数値化した物と2という文字列を数値化した物を足した結果の数値を文字列化してAに代入します。つまり、目に見える物は全て文字列です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux Linuxのbash環境下です。 1 2022/11/27 12:31
- その他(プログラミング・Web制作) x86_32ビットアセンブラ 2 2023/06/28 17:50
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- Java Java 南京錠 2 2023/02/04 11:46
- UNIX・Linux Linuxのメッセージを出力して処理を終了する方法 1 2022/11/19 20:31
- 高校 存在命題の基本的な質問 1 2022/04/19 14:32
- 高校 変数置き換えにつきまして 6 2022/05/01 16:44
- Excel(エクセル) エクセルで文字列と数字が混在する列に書式設定したい。 3 2022/12/19 09:11
- 数学 写真の問題の(4)についてですが、例えば赤のカードにおいて、他の数字は1枚ずつのままで5が2枚(他の 4 2023/07/29 03:49
- Excel(エクセル) Excel 値を返す数式についてです 3 2022/11/21 20:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
エクセルで文字列をtxtファイル...
-
LEFT関数で文字数を指定しない...
-
VBAを使って選択した範囲の数字...
-
文字列からタブコードを取り除...
-
BAHTTEXT関数?!
-
VBAでの Replace関数で、ワイル...
-
VBA2005 16進を2桁で表示したい。
-
CStringの文字列検索&抜き出し...
-
【Excel VBA】複数ある特定の文...
-
Msgboxの×が押されたとき
-
VB6.0のString関数に代わるVB20...
-
OnTime 使用時のプロシージャへ...
-
ランダムアクセスファイルの扱い方
-
エクセルで文字列の最大値を抽...
-
エクセルでセル内の文字列の最...
-
VBscriptで文字サイズを指定で...
-
ACCESSのSQLでのカンマ’認識に...
-
VBscriptからバッチに変数を渡...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
【Excel VBA】複数ある特定の文...
-
Excelで3E8を3.00E+8にしない方...
-
エクセルで文字列をtxtファイル...
-
エクセルで文字列の最大値を抽...
-
VBA2005 16進を2桁で表示したい。
-
Excelで指数表現しないようにす...
-
エクセル 数値データを桁をそ...
-
同一セル内に関数と文字列を同...
-
Left関数とRight関数を合わせた...
-
MS SQLServer のSQLで文字列の...
-
Msgboxの×が押されたとき
-
ORCLEでの小数の表示方法の変更...
-
textboxユーザーコントロールの...
-
VBの「As String * 128」とは?
-
Pro c/c++ でホスト変数の後に....
-
変数内に入った文字列の結合 UWSC
おすすめ情報