105.2標準
config.iniにenabledという文字列が見つかったときだけ処理を実行する。
grepの終了状態をifの条件として直接使う。
適切な記述はどれか。
× 不正解
ifは角括弧専用の構文ではなく、条件リストとして実行したコマンドの終了状態を評価する。grep -qは表示せず一致の有無を終了状態で返す。
詳細解説
誤り
if [ grep -q enabled config.ini ]; then run_job; fi[は文字列やファイル条件を評価するコマンドで、内部のgrepを実行しない。
誤り。[はtestコマンドであり、内側の語を別コマンドとして起動せず、文字列式の引数として解析する。
誤り
if $(grep -q enabled config.ini); then run_job; fi標準出力のないgrep -qをコマンド名へ置換しようとする。
誤り。grep -qは一致内容を出力しないため置換結果が空になり、ifが評価するコマンド自体を構成できない。
誤り
if $? grep -q enabled config.ini; then run_job; fi$?をコマンド位置へ展開する無効な並びである。
誤り。$?は0や1などへ展開され、その数値をコマンド名として実行しようとするため有効な条件にならない。
正しい
if grep -q enabled config.ini; then run_job; figrep自身の終了状態をifが評価し、成功時だけthen節へ進む。
正しい。ifはgrep -qを実行し、一致時の終了状態0でthen節、不一致等の非0で後続分岐を選ぶ。
実際に確かめる
一時的な検証環境で実行できる例です。
file=$(mktemp); printf '%s\n' enabled > "$file"; if grep -q enabled "$file"; then printf match; fi; rm -f -- "$file"期待される結果
match理解のポイント
- ifは終了状態を評価
- grep -qは静かに判定
- [はtestコマンド
確認時の注意
- 確認環境: GNU Bash 5.2 / GNU grep / 一時ファイル
基礎のおさらい
終了状態による真偽
シェルでは終了状態0を成功または真として扱い、0以外を失敗または偽として扱う。
grep -q
一致行を表示せず最初の一致で判定できるため、内容ではなく有無だけが必要な条件に向く。
問題IDKP-105-625
確認環境GNU Bash 5.2 / GNU grep / 一時ファイル
最終技術確認2026-08-13
誤り・権利侵害を報告