1.06.2基礎
現在の位置引数は--verbose、input.txt、output.txtの順である。
先頭の--verboseを処理済みとして除き、input.txtを新しい$1にする。
適切なコマンドはどれか。
× 不正解
shiftは第1位置引数を取り除き、旧$2を新$1へ繰り上げる。引数解析ループで1件ずつ消費できる。
詳細解説
誤り
unset $1展開結果を変数名として削除しようとし、位置引数を詰めない。
unsetは変数名を対象にする。$1を展開して得た--verboseを削除対象名にしても、位置引数列は詰められない。
誤り
pop $1POSIX shに位置引数を取り除くpop組込みはない。
POSIX shにはスタックのpopのように位置引数を消費する組込みはない。引数列の先頭消費にはshiftを使う。
誤り
set $2 $3未引用の再設定で値の分割・展開を招き、一般的な1件消費操作ではない。
位置引数を再設定するならset -- "$2" "$3"など引用が必要で、個数も固定される。任意長の先頭1件を消費する標準操作としては冗長である。
正しい
shift$1を破棄して後続の位置引数を1つずつ前へ移す。
shiftは旧$1を破棄し、旧$2を新$1、旧$3を新$2へ移す。同時に$#も1減る。
実際に確かめる
一時的な検証環境で実行できる例です。
sh -c 'shift; printf "%s|%s|%s\n" "$#" "$1" "$2"' parser --verbose input.txt output.txt期待される結果
2|input.txt|output.txt理解のポイント
- shiftは先頭を消費
- $#も1減る
- shift NでN件消費
確認時の注意
- 確認環境: POSIX sh / 短命プロセス
- shift前に十分な引数数があることを確認する。
基礎のおさらい
shift N
引数なしは1件、shift NはN件を取り除く。残数を超えるshiftは非0で失敗する。
解析ループ
while [ "$#" -gt 0 ]; do case $1 in ... esac; shift; doneのように組み合わせられる。
問題IDKL-102-936
確認環境POSIX sh / 短命プロセス
最終技術確認2026-08-13
誤り・権利侵害を報告