助け合いフォーラム
Linux Essentials(Ver1.6)
問題ID : 2841
問題を開く
カレントディレクトリに以下のファイルがある。
test01.txt test10.txt script01.sh script02.sh
以下のシェルスクリプトを実行したときの実行結果として正しいものを選べ。
test01.txt test10.txt script01.sh script02.sh
以下のシェルスクリプトを実行したときの実行結果として正しいものを選べ。
正解
script02.sh
解説
シェルスクリプトでは、構文「for」を用いて繰り返し処理を行うことができます。
for文の書式は以下の通りです。

設問では、ファイル名の末尾が「.sh」のファイルを変数「f」へ代入して一つずつ処理しています。
したがってdo~done内の以下の処理を「script01.sh」「script02.sh」に対して順に実行していきます。

本処理は変数fの内容を変数aへ代入していますが、aの内容はループするたびに上書きされるため、最終的には文字列"script02.sh"が代入されています。
したがって正解は
・script02.sh
です。
その他の選択は誤りです。
for文の書式は以下の通りです。

設問では、ファイル名の末尾が「.sh」のファイルを変数「f」へ代入して一つずつ処理しています。
したがってdo~done内の以下の処理を「script01.sh」「script02.sh」に対して順に実行していきます。

本処理は変数fの内容を変数aへ代入していますが、aの内容はループするたびに上書きされるため、最終的には文字列"script02.sh"が代入されています。
したがって正解は
・script02.sh
です。
その他の選択は誤りです。
参考
【スクリプト】
GUI(Graphical User Interface)と比べた時のCUI(Character User Interface)の利点に、一連の手続きをファイルに保存し、自動化できる「スクリプト」があります。
スクリプト(script:台本、脚本など)とは、プログラムのように「人間がコードを書く」→「機械語へ翻訳する」→「実行」という段階を経ることなく、人間が書いたコードをそのまま実行することができます。
LinuxにはcshやBashなどのシェルがありますが、シェルに読み込ませるスクリプトを「シェルスクリプト」といいます。本項ではBashの構文を基に、スクリプトについて学習します。
●簡単なスクリプト
シェルスクリプトは、今までに覚えたコマンドを利用して作ることができます。
例えば、「ホームディレクトリへ移動し、ファイル一覧を表示する」というだけの一連の手続きをスクリプトにすると以下のようになります。
#!/bin/bash
cd ~/
ls
この3行をファイル「home.sh」として保存し、「bash home.sh」と実行すると、記述した通りに実行されます。
シェルスクリプトでは、このような簡易なものだけでなく、複雑な処理も行うことができます。
【基本的な構文】
●シェバン(shebang)
先例「home.sh」の1行目は、Bashでスクリプトを実行する、という意味のおまじないで「シェバン(シバン、シェバング)」といいます。「#!」に続けてどのインタープリタ(シェルなどのプログラム)で実行するかを指定するもので、cshで動作させる場合は「#!/bin/csh」などと記述します。シェバンの記述がなくても動作はしますが、意図しない動作を防ぐために原則的には記述した方がよいでしょう。
なお、シェルスクリプトのファイル名は慣習的に「.sh」という接尾辞(suffix)を付与します。ただし「.txt」などと同様にOSに対しての意味はないため、「.sh」のつかないシェルスクリプトも存在します。
●変数
シェルスクリプトでは変数を扱うことができます。
変数への値の代入と値の参照は以下のように行います。
例)変数「var」へ文字列「Essentials」を代入する
var="Essentials"
※変数と"="、値の間にスペースを入れてはいけません。
例)変数「var」の値を参照する
$var
「echo $var」などとすると、変数varの値が標準出力へ出力されます。
●引数
シェルスクリプトでは引数を扱うこともできます。
引数の数は「$#」、引数は先頭から「$1」「$2」などと参照できます。
例)スクリプトで引数を扱う

●繰り返し(ループ)処理
シェルスクリプトでは、例えば「カレントディレクトリのにある全てのテキストファイル *.txt をすべてコピーしたい」というような場合、処理をループ(繰り返し)で行うことができます。
以下は、forを使ったループ処理の書式です。

※do~doneまではループ内の処理なので、通常は(読みやすさのために)スペースまたはタブで文字下げします。
「変数」には、「値のリスト」にある値が一つずつ代入され、処理を行います。
例えば、カレントディレクトリに「a.txt」「b.txt」「c.txt」が存在する場合、for文を使って以下のように処理することができます。
例)カレントディレクトリにある「.txt」で終わるファイルすべてをコピーする

変数「$text」には「a.txt」「b.txt」「c.txt」が順に代入され、do~doneの処理「cp $text $text.cp」が実行されます。したがって、本処理が実行されると「a.txt.cp」「b.txt.cp」「c.txt.cp」というファイルが作成されます。
●終了ステータス(リターンコード)
Linux(Unix)のコマンドは、コマンドの実行結果を終了ステータス(リターンコード)で返すという仕組みが組み込まれています。
例えば「ls」とコマンドを実行すると、カレントディレクトリにあるファイル一覧が表示されてコマンドが終了します。直後にechoコマンドで「$?」という変数を表示すると、終了ステータスを参照することができます。
例)終了ステータスを参照する
$ ls
file1.txt file2.txt
$ echo $?
0
変数「$?」には、直前に実行したコマンドの終了ステータスが格納されます。
終了ステータスは以下の意味を持ちます:
・コマンドが正常終了したとき ... 0
・コマンドが異常終了したとき ... 1~255
lsコマンドで存在しないファイルを指定した際はエラーになりますが、終了ステータスを参照すると以下のようになります。
例)終了ステータスを参照する(コマンドが異常終了した時)
$ ls file.txt
ls: cannot access file.txt: No such file or directory
$ echo $?
2
終了ステータスがどのような意味をもつのかは、manまたはinfoコマンドのマニュアルに書かれていることがあります。
終了ステータスを活用すると、コマンドの実行結果次第で処理を分岐させることもできます。
例えば、分野「コマンドラインの基本」で学習したメタキャラクタに以下のようなものがあります:
・コマンド1 && コマンド2 ... コマンド1が成功した場合、コマンド2を実行
・コマンド1 || コマンド2 ... コマンド1が失敗した場合、コマンド2を実行
この「&&」「||」はいずれもコマンド1の終了ステータスを判断しています。
メタキャラクタはシェルスクリプトでも利用できますので、以下のような処理を書くこともできます。
例)ディレクトリを作成し、成功した場合にファイルを移動させる
mkdir tmp && mv *.txt tmp
例)ディレクトリを作成し、失敗した場合はエラーメッセージを表示する
mkdir tmp || echo "mkdir error"
●実行方法
シェルスクリプトを実行するには以下の方法があります。
・実行権を付与して実行
・bashコマンド または sourceコマンドの引数に渡して実行
・実行権を付与して実行
Linux(Unix)のファイル・ディレクトリには以下の三つの権限が付与されています。
読み取り権(r:read) ... 参照することができる
書き込み権(w:write) ... 書き込み・更新することができる
実行権(x:execute) ... 実行することができる
※権限(パーミッション)の詳細は、分野「ファイルのパーミッションと所有権を管理する」にて学習します。
ファイル・ディレクトリに与えられている権限は、コマンド「ls -l」で確認することができます。

実行権が付与されたファイルは、lsコマンドなどと同様にファイルをコマンドとして扱うことができるようになります。
ただし、環境変数PATHに設定されていないディレクトリのスクリプトを実行する際は、パスを指定することを忘れないでください。
例えばディレクトリ「/home/user01/bin」へ保存したスクリプト「home.sh」を実行するには以下の方法があります。
例)実行権が付与されたスクリプト「home.sh」を実行する
○絶対パスを指定して実行
$ /home/user01/bin/home.sh
○ディレクトリを移動して相対パスで実行
$ cd /home/user01/bin
$ ./home.sh
○環境変数PATHに「/home/user01/bin」を追加して実行
$ export PATH="/home/user01/bin:$PATH"
$ home.sh
※環境変数PATHについては、分野「コマンドラインの基本」を参照してください。
なお、実行権が与えられていない場合に上記のように実行すると、エラーが出力されて実行できません。
例)実行権が与えられていないスクリプトを実行する
$ ./script.sh
-bash: ./script.sh: Permission denied
→ Permission denied=権限が不正 という理由のエラーになる
・bashコマンド または sourceコマンドの引数に渡して実行
コマンドbashやsourceは、引数に指定されたファイルを実行します。
例)スクリプト「home.sh」を実行する
$ bash home.sh
$ source home.sh
この時のスクリプトには、実行権が付与されている必要はありません。
sourceコマンドとbashコマンドには以下のような違いがあります。
・sourceコマンド ... 指定したシェルスクリプトを読み込み、現在のシェルで実行する。スクリプトで設定した変数はシェル変数として現在のシェルで参照される。また、現在のシェルに設定しているシェル変数もスクリプトで参照される
・bashコマンド ... シェルを起動してシェルスクリプトを実行する。スクリプトで設定した変数はスクリプト内(起動したシェル内)で完結し、現在のシェルに設定しているシェル変数もスクリプトへ反映されない
以下は、sourceコマンドとbashコマンドの実行例です。
例)シェル変数SAMPLEの扱い

なお、環境変数はsource、bashに関わらず参照されます。
GUI(Graphical User Interface)と比べた時のCUI(Character User Interface)の利点に、一連の手続きをファイルに保存し、自動化できる「スクリプト」があります。
スクリプト(script:台本、脚本など)とは、プログラムのように「人間がコードを書く」→「機械語へ翻訳する」→「実行」という段階を経ることなく、人間が書いたコードをそのまま実行することができます。
LinuxにはcshやBashなどのシェルがありますが、シェルに読み込ませるスクリプトを「シェルスクリプト」といいます。本項ではBashの構文を基に、スクリプトについて学習します。
●簡単なスクリプト
シェルスクリプトは、今までに覚えたコマンドを利用して作ることができます。
例えば、「ホームディレクトリへ移動し、ファイル一覧を表示する」というだけの一連の手続きをスクリプトにすると以下のようになります。
#!/bin/bash
cd ~/
ls
この3行をファイル「home.sh」として保存し、「bash home.sh」と実行すると、記述した通りに実行されます。
シェルスクリプトでは、このような簡易なものだけでなく、複雑な処理も行うことができます。
【基本的な構文】
●シェバン(shebang)
先例「home.sh」の1行目は、Bashでスクリプトを実行する、という意味のおまじないで「シェバン(シバン、シェバング)」といいます。「#!」に続けてどのインタープリタ(シェルなどのプログラム)で実行するかを指定するもので、cshで動作させる場合は「#!/bin/csh」などと記述します。シェバンの記述がなくても動作はしますが、意図しない動作を防ぐために原則的には記述した方がよいでしょう。
なお、シェルスクリプトのファイル名は慣習的に「.sh」という接尾辞(suffix)を付与します。ただし「.txt」などと同様にOSに対しての意味はないため、「.sh」のつかないシェルスクリプトも存在します。
●変数
シェルスクリプトでは変数を扱うことができます。
変数への値の代入と値の参照は以下のように行います。
例)変数「var」へ文字列「Essentials」を代入する
var="Essentials"
※変数と"="、値の間にスペースを入れてはいけません。
例)変数「var」の値を参照する
$var
「echo $var」などとすると、変数varの値が標準出力へ出力されます。
●引数
シェルスクリプトでは引数を扱うこともできます。
引数の数は「$#」、引数は先頭から「$1」「$2」などと参照できます。
例)スクリプトで引数を扱う

●繰り返し(ループ)処理
シェルスクリプトでは、例えば「カレントディレクトリのにある全てのテキストファイル *.txt をすべてコピーしたい」というような場合、処理をループ(繰り返し)で行うことができます。
以下は、forを使ったループ処理の書式です。

※do~doneまではループ内の処理なので、通常は(読みやすさのために)スペースまたはタブで文字下げします。
「変数」には、「値のリスト」にある値が一つずつ代入され、処理を行います。
例えば、カレントディレクトリに「a.txt」「b.txt」「c.txt」が存在する場合、for文を使って以下のように処理することができます。
例)カレントディレクトリにある「.txt」で終わるファイルすべてをコピーする

変数「$text」には「a.txt」「b.txt」「c.txt」が順に代入され、do~doneの処理「cp $text $text.cp」が実行されます。したがって、本処理が実行されると「a.txt.cp」「b.txt.cp」「c.txt.cp」というファイルが作成されます。
●終了ステータス(リターンコード)
Linux(Unix)のコマンドは、コマンドの実行結果を終了ステータス(リターンコード)で返すという仕組みが組み込まれています。
例えば「ls」とコマンドを実行すると、カレントディレクトリにあるファイル一覧が表示されてコマンドが終了します。直後にechoコマンドで「$?」という変数を表示すると、終了ステータスを参照することができます。
例)終了ステータスを参照する
$ ls
file1.txt file2.txt
$ echo $?
0
変数「$?」には、直前に実行したコマンドの終了ステータスが格納されます。
終了ステータスは以下の意味を持ちます:
・コマンドが正常終了したとき ... 0
・コマンドが異常終了したとき ... 1~255
lsコマンドで存在しないファイルを指定した際はエラーになりますが、終了ステータスを参照すると以下のようになります。
例)終了ステータスを参照する(コマンドが異常終了した時)
$ ls file.txt
ls: cannot access file.txt: No such file or directory
$ echo $?
2
終了ステータスがどのような意味をもつのかは、manまたはinfoコマンドのマニュアルに書かれていることがあります。
終了ステータスを活用すると、コマンドの実行結果次第で処理を分岐させることもできます。
例えば、分野「コマンドラインの基本」で学習したメタキャラクタに以下のようなものがあります:
・コマンド1 && コマンド2 ... コマンド1が成功した場合、コマンド2を実行
・コマンド1 || コマンド2 ... コマンド1が失敗した場合、コマンド2を実行
この「&&」「||」はいずれもコマンド1の終了ステータスを判断しています。
メタキャラクタはシェルスクリプトでも利用できますので、以下のような処理を書くこともできます。
例)ディレクトリを作成し、成功した場合にファイルを移動させる
mkdir tmp && mv *.txt tmp
例)ディレクトリを作成し、失敗した場合はエラーメッセージを表示する
mkdir tmp || echo "mkdir error"
●実行方法
シェルスクリプトを実行するには以下の方法があります。
・実行権を付与して実行
・bashコマンド または sourceコマンドの引数に渡して実行
・実行権を付与して実行
Linux(Unix)のファイル・ディレクトリには以下の三つの権限が付与されています。
読み取り権(r:read) ... 参照することができる
書き込み権(w:write) ... 書き込み・更新することができる
実行権(x:execute) ... 実行することができる
※権限(パーミッション)の詳細は、分野「ファイルのパーミッションと所有権を管理する」にて学習します。
ファイル・ディレクトリに与えられている権限は、コマンド「ls -l」で確認することができます。

実行権が付与されたファイルは、lsコマンドなどと同様にファイルをコマンドとして扱うことができるようになります。
ただし、環境変数PATHに設定されていないディレクトリのスクリプトを実行する際は、パスを指定することを忘れないでください。
例えばディレクトリ「/home/user01/bin」へ保存したスクリプト「home.sh」を実行するには以下の方法があります。
例)実行権が付与されたスクリプト「home.sh」を実行する
○絶対パスを指定して実行
$ /home/user01/bin/home.sh
○ディレクトリを移動して相対パスで実行
$ cd /home/user01/bin
$ ./home.sh
○環境変数PATHに「/home/user01/bin」を追加して実行
$ export PATH="/home/user01/bin:$PATH"
$ home.sh
※環境変数PATHについては、分野「コマンドラインの基本」を参照してください。
なお、実行権が与えられていない場合に上記のように実行すると、エラーが出力されて実行できません。
例)実行権が与えられていないスクリプトを実行する
$ ./script.sh
-bash: ./script.sh: Permission denied
→ Permission denied=権限が不正 という理由のエラーになる
・bashコマンド または sourceコマンドの引数に渡して実行
コマンドbashやsourceは、引数に指定されたファイルを実行します。
例)スクリプト「home.sh」を実行する
$ bash home.sh
$ source home.sh
この時のスクリプトには、実行権が付与されている必要はありません。
sourceコマンドとbashコマンドには以下のような違いがあります。
・sourceコマンド ... 指定したシェルスクリプトを読み込み、現在のシェルで実行する。スクリプトで設定した変数はシェル変数として現在のシェルで参照される。また、現在のシェルに設定しているシェル変数もスクリプトで参照される
・bashコマンド ... シェルを起動してシェルスクリプトを実行する。スクリプトで設定した変数はスクリプト内(起動したシェル内)で完結し、現在のシェルに設定しているシェル変数もスクリプトへ反映されない
以下は、sourceコマンドとbashコマンドの実行例です。
例)シェル変数SAMPLEの扱い

なお、環境変数はsource、bashに関わらず参照されます。
for ~ in ~ で変数に入る値のリストの順番
投稿日 2026/08/06
「カレントディレクトリに以下のファイルがある」との事で「ls」の結果らしい
「test01.txt test10.txt script01.sh script02.sh」がありますが
「for 変数 in 値のリスト」の時、リストの並び順に規則性や法則性があるのでしょうか?
或いは問題文のファイルのリストが明記されている順番に従い「script02.sh」が
解答という事なのでしょうか。
問題文のファイルの並びは「ls -r」の結果と推測しているのですが、
単純にそれがfor文時の代入時に適用されるルールなのだとすると
「-r」の必要性が少々不自然に思え、他の言語のfor each等の様に
決まりがないとすると、どれか1つのファイル名が表示はされるが
どのファイル名が表示される(=最後に代入される)のかは
コントロール出来ないのではないかと思いました。
2026/08/06 16:37
lsコマンドでカレントディレクトリ以下を表示させると本来ならばアルファベット順になるのですが、
問題文ではt→sになってますね。
基本的にはアルファベット順、数字も0→9といった風になるので
02であるscript02.shが最後に拾った値として出力されたといったところでしょうか。
コメント
2026/08/06 17:59
設問では for i in *.sh なので、test01.txt と text10.txt は対象外になりますし、あとは数字だけの比較なので間違いなく script02.sh が正答と言えるんじゃないかなと思います。
$ touch test01.txt test10.txt script01.sh script02.sh
$ ls
script01.sh script02.sh test01.txt test10.txt
$ ls *.sh
script01.sh script02.sh
$ for f in *.sh
> do
> echo $f
> done
script01.sh
script02.sh
コメント
この投稿に対して返信しませんか?
w winwidelive
2026/08/06 16:57
その場合ですと解答は「test10.txt」という事になりませんでしょうか。