以下のシェルスクリプトで、
#!/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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
文字列からタブコードを取り除...
-
EXCELで=より左の文字を一括で...
-
Left関数とRight関数を合わせた...
-
【Excel VBA】複数ある特定の文...
-
VBAでの Replace関数で、ワイル...
-
vbsからバッチファイル実行時の...
-
Excelで指数表現しないようにす...
-
エクセルで文字列の最大値を抽...
-
C#で年月を比較する
-
Excelで3E8を3.00E+8にしない方...
-
エクセルで文字列をtxtファイル...
-
アクセスで特定の数字以外(複...
-
16進数を10進数に簡単に変換す...
-
同一セル内に関数と文字列を同...
-
VBA2005 16進を2桁で表示したい。
-
CStringの文字列検索&抜き出し...
-
VBの「As String * 128」とは?
-
C# 巨大な文字列の計算をさせたい
-
MS SQLServer のSQLで文字列の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
Excelで3E8を3.00E+8にしない方...
-
エクセルで文字列をtxtファイル...
-
Excelで指数表現しないようにす...
-
【Excel VBA】複数ある特定の文...
-
Left関数とRight関数を合わせた...
-
エクセルで文字列の最大値を抽...
-
同一セル内に関数と文字列を同...
-
VBA2005 16進を2桁で表示したい。
-
VBの「As String * 128」とは?
-
MS SQLServer のSQLで文字列の...
-
エクセル 数値データを桁をそ...
-
C#で年月を比較する
-
16進数を10進数に簡単に変換す...
-
“丸(〇/○/◯)”に似た文字…
-
アクセスで特定の数字以外(複...
-
Msgboxの×が押されたとき
おすすめ情報