LPIC-1「シェルとスクリプト」練習問題(23問・解説つき)
LPIC-1(101/102 試験)「シェルとスクリプト」の4択問題集。正解と選択肢ごとの個別解説つきで、過去問対策・例題演習に。
主なテーマ:bash環境変数・シェルスクリプト・条件分岐
▶ この分野をクイズ形式で解く第1問 ・ LPIC-1 / シェルとスクリプト
シェル変数を子プロセスにも引き継がせるコマンドは?
- set
- export✓ 正解
- alias
- unset
💡 exportで変数を環境変数化し、子プロセスへ継承させます。setはシェル変数の表示/設定です。
✕ set:set はシェル変数やオプションの表示/設定で、子プロセスへの継承はしません。
○ export:正解。export で変数を環境変数化し、子プロセスへ引き継がせます。
✕ alias:alias はコマンドの別名定義で、変数の継承とは無関係です。
✕ unset:unset は変数やエイリアスの削除で、継承させる機能はありません。
第2問 ・ LPIC-1 / シェルとスクリプト
シェルスクリプト1行目で実行シェルを指定する記述は?
- //bin/bash
- @bash
- #!/bin/bash✓ 正解
- run bash
💡 先頭の#!(シバン)で使うインタプリタを指定します。例:#!/bin/bash。#単独はコメント行です。
✕ //bin/bash://bin/bash は先頭が#!ではないため、シバンとして解釈されません。
✕ @bash:@bash はシバンの記法ではなく、インタプリタ指定として無効です。
○ #!/bin/bash:正解。#!/bin/bash のように先頭の#!(シバン)で実行シェルを指定します。
✕ run bash:run bash はシバンの構文ではなく、インタプリタ指定にはなりません。
第3問 ・ LPIC-1 / シェルとスクリプト
直前のコマンドの終了ステータスが格納される変数は?
- $?✓ 正解
- $!
- $$
- $0
💡 $?は直前コマンドの終了コード(0=成功)を保持します。$$は自プロセスのPID、$0はスクリプト名です。
○ $?:正解。$? は直前コマンドの終了ステータス(0=成功)を保持します。
✕ $!:$! は直近にバックグラウンド実行したプロセスのPIDで、終了ステータスではありません。
✕ $$:$$ は現在のシェル自身のPIDで、終了ステータスではありません。
✕ $0:$0 はスクリプト名(実行コマンド名)で、終了ステータスではありません。
第4問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
現在のシェルに定義されたエイリアス ll を削除するコマンドは?
- unset ll
- unalias ll✓ 正解
- alias -d ll
- rmalias ll
💡 エイリアスの削除は unalias を使います。全削除は unalias -a。unset はシェル変数/関数の削除用でエイリアスには使えません。
✕ unset ll:unset はシェル変数や関数の削除用で、エイリアスの削除には使えません。
○ unalias ll:正解。unalias でエイリアスを削除します(全削除は unalias -a)。
✕ alias -d ll:alias -d というオプションは存在せず、エイリアス削除には使えません。
✕ rmalias ll:rmalias というコマンドは存在しません。
第5問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
編集した ~/.bashrc を、新しいシェルを起動せずに現在のシェルへ反映させるコマンドはどれか。
- source ~/.bashrc✓ 正解
- exec ~/.bashrc
- run ~/.bashrc
- bash ~/.bashrc
💡 source(または .)は指定ファイルを現在のシェルで読み込み、設定を即時反映します。bash ~/.bashrc はサブシェルで実行するため現在のシェルには反映されません。
○ source ~/.bashrc:source(.)は指定ファイルを現在のシェル内で読み込み、設定を即座に反映するため正しい。
✕ exec ~/.bashrc:execは現在のシェルを指定プログラムで置換するもので、設定ファイル読み込み用途ではない。
✕ run ~/.bashrc:runというコマンドはbashに存在せず、設定の反映には使えない。
✕ bash ~/.bashrc:bash ~/.bashrcはサブシェルで実行され、現在のシェルには設定が反映されない。
第6問 ・ LPIC-1 / シェルとスクリプト
bashでシェル関数を定義する正しい構文はどれか?
- function greet { echo hi }
- def greet() { echo hi; }
- greet() { echo hi; }✓ 正解
- greet = () { echo hi; }
💡 名前() { コマンド; } が関数定義の標準形です。{ } 内の最後のコマンドには ; か改行が必要です。def はbashの構文ではありません。
✕ function greet { echo hi }:functionキーワード使用時も末尾コマンドに;か改行が必要で、{ echo hi }は構文エラーになる。
✕ def greet() { echo hi; }:defはPython等の構文でbashには存在せず、関数定義には使えない。
○ greet() { echo hi; }:名前() { コマンド; }が標準形で、末尾に;があり正しい関数定義である。
✕ greet = () { echo hi; }:name = () の形式はbashの関数定義構文ではなく、エラーとなる。
第7問 ・ LPIC-1 / シェルとスクリプト
スクリプトに渡された位置パラメータ(引数)の個数を表す変数はどれか?
- $@
- $*
- $#✓ 正解
- $0
💡 $# は渡された引数の個数を表します。$@ と $* は全引数のリスト、$0 はスクリプト名(実行コマンド名)です。
✕ $@:$@は全引数を個別に展開するリストであり、引数の個数を表すものではない。
✕ $*:$*は全引数を1つにまとめて展開するもので、引数の個数を表さない。
○ $#:$#は渡された位置パラメータ(引数)の個数を表すため正しい。
✕ $0:$0はスクリプト名(実行コマンド名)であり、引数の個数ではない。
第8問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
date コマンドの出力を変数 now に代入したい。正しいコマンド置換はどれか?
- now=$(date)✓ 正解
- now=$date
- now=(date)
- now="date"
💡 $(...) はコマンド置換で、コマンドの標準出力を値として展開します。等価な旧表記はバッククォート `date` です。now="date" は文字列 date が入るだけです。
○ now=$(date):$(date)はコマンド置換でdateの実行結果を変数に代入できるため正しい。
✕ now=$date:$dateはdateという変数の値を参照するもので、未定義なら空になる。
✕ now=(date):now=(date)は配列代入の構文で、要素が文字列dateになりコマンドは実行されない。
✕ now="date":now="date"は文字列dateを代入するだけで、コマンドは実行されない。
第9問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
if 文で変数 $name が空文字列かどうかを判定する test 式はどれか?
- [ -e "$name" ]
- [ -z "$name" ]✓ 正解
- [ -n "$name" ]
- [ "$name" = empty ]
💡 -z は文字列の長さが0(空)なら真。逆に -n は長さが0より大きければ真。-e はファイルの存在判定演算子です。
✕ [ -e "$name" ]:-eはファイルの存在を判定する演算子で、文字列が空かどうかの判定には使えない。
○ [ -z "$name" ]:-zは文字列の長さが0(空)のとき真となり、空文字列の判定として正しい。
✕ [ -n "$name" ]:-nは文字列の長さが0より大きいとき真で、空でないことの判定になる。
✕ [ "$name" = empty ]:値がemptyという文字列かを比較するだけで、空文字列かどうかの判定にはならない。
第10問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
1から5までの数値を順に処理する for ループを書きたい。空欄に入る最も適切な記述はどれか? for i in ___ ; do echo $i; done
- range 1 5
- $(seq 1 5)✓ 正解
- [1..5]
- 1 to 5
💡 seq 1 5 は 1 2 3 4 5 を出力し、コマンド置換 $(seq 1 5) でリスト化できます。bashなら {1..5} も使えますが range や [1..5] という構文はありません。
✕ range 1 5:rangeはbashの構文やコマンドではなく、1〜5の列を生成できない。
○ $(seq 1 5):$(seq 1 5)はseqの出力1 2 3 4 5をコマンド置換でリスト化でき正しい。
✕ [1..5]:[1..5]という構文はbashに存在せず、数値列を生成しない。
✕ 1 to 5:1 to 5はbashの構文ではなく、forのリストとして機能しない。
第11問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
現在のシェルに設定された「環境変数」だけを一覧表示するコマンドはどれか。シェル変数は含めない。
- set
- env✓ 正解
- export -p
- declare
💡 env は環境変数(子プロセスへ継承される変数)のみを一覧表示します。set はシェル変数・環境変数・関数をすべて表示するため、環境変数だけを見るには env が適切です。printenv も同等に使えます。
✕ set:set は環境変数に加えてシェル変数や関数まで表示するため、環境変数だけの一覧にはなりません。
○ env:正解。env は子プロセスへ継承される環境変数のみを一覧表示します(printenv も同等)。
✕ export -p:export -p はエクスポート済み変数を declare 形式で出力しますが、設問が想定する標準的な環境変数一覧コマンドは env です。
✕ declare:declare は引数なしだとシェル変数・関数も含めて表示し、環境変数限定の一覧ではありません。
第12問 ・ LPIC-1 / シェルとスクリプト
シェル変数 FOO を定義したが、子プロセスから参照できなかった。子プロセスでも参照できるようにするための正しい説明はどれか。
- シェル変数はすべて自動的に子プロセスへ継承される
- export FOO で環境変数化すれば子プロセスへ継承される✓ 正解
- set FOO とすると継承されるようになる
- unset FOO とすれば継承される
💡 通常のシェル変数はそのシェル内でのみ有効で、子プロセスへは継承されません。export で環境変数にすることで初めて子プロセスへ引き継がれます。
✕ シェル変数はすべて自動的に子プロセスへ継承される:シェル変数は定義したシェル内でのみ有効で、自動的には子プロセスへ継承されません。
○ export FOO で環境変数化すれば子プロセスへ継承される:正解。export FOO で環境変数化すると、その後起動する子プロセスへ値が継承されます。
✕ set FOO とすると継承されるようになる:set は変数の継承を行うコマンドではなく、シェル変数やオプションの表示/設定用です。
✕ unset FOO とすれば継承される:unset は変数を削除するコマンドで、継承させる機能はありません。
第13問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
ls に色付き表示の別名 ls='ls --color=auto' を、現在のシェルに定義する正しいコマンドはどれか。
- alias ls='ls --color=auto'✓ 正解
- alias ls = 'ls --color=auto'
- set ls='ls --color=auto'
- export ls='ls --color=auto'
💡 alias 名前='値' でエイリアスを定義します。= の前後に空白を入れてはいけません。export や set は変数用で、エイリアス定義には使えません。
○ alias ls='ls --color=auto':正解。alias 名前='値' の形式(= の前後に空白なし)でエイリアスを定義します。
✕ alias ls = 'ls --color=auto':= の前後に空白があると alias の構文として解釈されず、エラーになります。
✕ set ls='ls --color=auto':set はシェル変数やオプションの設定用で、エイリアスは定義できません。
✕ export ls='ls --color=auto':export は変数を環境変数化するコマンドで、エイリアスの定義には使えません。
第14問 ・ LPIC-1 / シェルとスクリプト
bash にログインした際、/etc/profile の後に /etc/profile.d 内のスクリプトはどのように扱われるか。最も適切な説明はどれか。
- /etc/profile.d は読み込まれない
- /etc/profile から /etc/profile.d/*.sh が読み込まれる✓ 正解
- /etc/profile.d は /etc/profile より先に読み込まれる
- /etc/profile.d はログアウト時にのみ読み込まれる
💡 ログインシェルではまず /etc/profile が読み込まれ、その中の処理で /etc/profile.d/*.sh が順に読み込まれます。これにより設定をファイル単位で分割管理できます。
✕ /etc/profile.d は読み込まれない:/etc/profile.d はログイン時に /etc/profile 経由で読み込まれるため、読み込まれないという説明は誤りです。
○ /etc/profile から /etc/profile.d/*.sh が読み込まれる:正解。/etc/profile の処理中に /etc/profile.d/*.sh が順次読み込まれます。
✕ /etc/profile.d は /etc/profile より先に読み込まれる:/etc/profile.d は /etc/profile の中から呼び出されるため、先に読み込まれるわけではありません。
✕ /etc/profile.d はログアウト時にのみ読み込まれる:/etc/profile.d はログイン時に読み込まれるもので、ログアウト時専用ではありません。
第15問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
cd というコマンド名を入力したとき、それがエイリアス・関数・シェル組み込み・外部コマンドのいずれであるかを調べるコマンドはどれか。
- which cd
- type cd✓ 正解
- file cd
- info cd
💡 type は名前がエイリアス・シェル関数・組み込みコマンド・外部コマンドのどれとして解決されるかを表示します。which は PATH 上の外部実行ファイルしか探せず、組み込みやエイリアスは正しく判別できません。
✕ which cd:which は PATH 上の外部実行ファイルを探すだけで、cd のような組み込みコマンドや関数は正しく判別できません。
○ type cd:正解。type はエイリアス・関数・組み込み・外部コマンドのいずれとして解決されるかを表示します。
✕ file cd:file はファイルの種別を調べるコマンドで、コマンド名の解決種別の判定には使えません。
✕ info cd:info はドキュメント閲覧コマンドで、コマンドの解決種別は表示しません。
第16問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
過去に実行したコマンドの履歴一覧を表示するコマンドはどれか。
- history✓ 正解
- last
- fc -e
- log
💡 history は現在のシェルのコマンド履歴を番号付きで一覧表示します。履歴は通常 ~/.bash_history に保存されます。last はログイン履歴の表示で別物です。
○ history:正解。history はコマンド履歴を番号付きで一覧表示します(履歴は ~/.bash_history に保存)。
✕ last:last はユーザーのログイン履歴を表示するコマンドで、コマンド実行履歴ではありません。
✕ fc -e:fc -e は履歴中のコマンドをエディタで編集して再実行するもので、一覧表示が主目的ではありません。
✕ log:log という標準コマンドは存在せず、コマンド履歴の表示には使えません。
第17問 ・ LPIC-1 / シェルとスクリプト
実行中のスクリプト内で、そのスクリプト自身のプロセスID(PID)を参照できる特殊変数はどれか。
- $!
- $$✓ 正解
- $?
- $#
💡 $$ は現在実行中のシェル(スクリプト)自身のプロセスIDを保持します。一時ファイル名に利用されることが多い変数です。$! は直近のバックグラウンドプロセスのPID、$? は終了ステータスです。
✕ $!:$! は直近にバックグラウンド実行したプロセスのPIDで、スクリプト自身のPIDではありません。
○ $$:正解。$$ は現在実行中のシェル(スクリプト)自身のプロセスIDを保持します。
✕ $?:$? は直前コマンドの終了ステータスを保持する変数で、PIDではありません。
✕ $#:$# は位置パラメータ(引数)の個数を表す変数で、PIDではありません。
第18問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
スクリプト内でユーザーからの入力を1行読み取り、変数 name に格納する組み込みコマンドはどれか。
- read name✓ 正解
- input name
- scan name
- get name
💡 read は標準入力から1行を読み取り、指定した変数に格納します。プロンプトを出すには read -p "..." name のように指定します。input/scan/get はbashの組み込みコマンドではありません。
○ read name:正解。read は標準入力から1行を読み取り、指定した変数に格納します(-p でプロンプト表示)。
✕ input name:input というbash組み込みコマンドは存在せず、入力の読み取りには使えません。
✕ scan name:scan というbash組み込みコマンドは存在せず、入力の読み取りには使えません。
✕ get name:get というbash組み込みコマンドは存在せず、入力の読み取りには使えません。
第19問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
ファイル /etc/passwd が「通常ファイルとして存在する」かどうかを判定する test 式はどれか。
- [ -d /etc/passwd ]
- [ -f /etc/passwd ]✓ 正解
- [ -x /etc/passwd ]
- [ -z /etc/passwd ]
💡 -f は対象が存在し、かつ通常ファイルであれば真になります。-d はディレクトリ、-x は実行可能、-z は文字列が空かどうかの判定で、いずれも通常ファイルの存在判定ではありません。
✕ [ -d /etc/passwd ]:-d は対象がディレクトリかどうかの判定で、通常ファイルの判定ではありません。
○ [ -f /etc/passwd ]:正解。-f は対象が存在し通常ファイルであるときに真となります。
✕ [ -x /etc/passwd ]:-x は実行権限があるかどうかの判定で、通常ファイルかどうかの判定ではありません。
✕ [ -z /etc/passwd ]:-z は文字列の長さが0かを判定する演算子で、ファイルの存在判定には使えません。
第20問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
数値変数 $a と $b が等しいかどうかを test コマンドで判定する正しい式はどれか。
- [ "$a" = "$b" ]
- [ "$a" -eq "$b" ]✓ 正解
- [ "$a" == "$b" ]
- [ "$a" -is "$b" ]
💡 数値の等価比較には -eq を使います(-lt, -gt, -ne 等も同系統)。= や == は文字列比較用で、"01" と "1" を等しいと判定できないなど数値比較には不向きです。
✕ [ "$a" = "$b" ]:= は文字列の等価比較演算子で、数値としての比較には適しません。
○ [ "$a" -eq "$b" ]:正解。-eq は数値の等価比較演算子で、数値が等しいときに真となります。
✕ [ "$a" == "$b" ]:== は(bash拡張の)文字列比較演算子で、数値比較には -eq を用います。
✕ [ "$a" -is "$b" ]:-is という比較演算子は存在せず、数値比較には使えません。
第21問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
変数 $a と $b の和を計算して表示したい。bash の算術展開を用いた正しい記述はどれか。
- echo $(($a + $b))✓ 正解
- echo $($a + $b)
- echo ${a + b}
- echo $[a - b]
💡 $(( 式 )) は算術展開で、内部で四則演算を評価します。$( ) はコマンド置換、${ } は変数展開で計算はできません。$[ ] は旧式で非推奨かつ設問は引き算で和になりません。
○ echo $(($a + $b)):正解。$(( 式 )) は算術展開で、$a + $b の和を計算して返します。
✕ echo $($a + $b):$( ) はコマンド置換で、$a をコマンドとして実行しようとし計算にはなりません。
✕ echo ${a + b}:${ } は変数展開の構文で、内部での算術計算はできません。
✕ echo $[a - b]:$[ ] は古い算術表記で非推奨であり、かつ式が引き算のため和にはなりません。
第22問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
mkdir backup が成功したときだけ続けて cd backup を実行したい。最も適切な記述はどれか。
- mkdir backup || cd backup
- mkdir backup && cd backup✓ 正解
- mkdir backup ; cd backup
- mkdir backup | cd backup
💡 && は左のコマンドが成功(終了ステータス0)したときだけ右を実行します。|| は左が失敗したときに右を実行、; は成否に関わらず順次実行、| はパイプで出力を渡すだけです。
✕ mkdir backup || cd backup:|| は左のコマンドが失敗したときに右を実行するため、成功時のみ実行する要件と逆です。
○ mkdir backup && cd backup:正解。&& は左が成功したときだけ右を実行するため、要件に合致します。
✕ mkdir backup ; cd backup:; は成否に関わらず両方を順次実行するため、成功時限定の条件にはなりません。
✕ mkdir backup | cd backup:| はパイプで標準出力を次へ渡すもので、成否による実行制御はしません。
第23問 ・ LPIC-1 / シェルとスクリプト ・ コマンド問題
$
環境変数 PATH の値を表示するコマンドはどれですか。
- echo $PATH✓ 正解
- echo PATH
- cat $PATH
- print PATH
💡 $ を付けて変数を参照し echo で表示します。$ なしでは文字列 PATH がそのまま出力されます。
○ echo $PATH:echo $PATH は $ で変数を参照し、その値を表示する正しい指定です。
✕ echo PATH:echo PATH は変数参照の $ がなく、文字列 PATH がそのまま出力されます。
✕ cat $PATH:cat $PATH はPATHの値をファイル名として開こうとし、値の表示にはなりません。
✕ print PATH:print はシェル標準の変数表示コマンドではなく、PATHの値は表示できません。
▶ この分野をクイズ形式で解く