第2回:「bashスクリプト入門~コマンドの自動化を体験~」
前回は、コマンドライン環境やファイル操作の基本に触れました。今回は、それらを一歩進めて「bashスクリプト」という形でコマンドを自動化・再利用可能な形にまとめる方法を学びます。
スクリプトを使うと、よく行う作業を自動化したり、複雑な処理を整理したりできます。これから脳画像解析に進む上で、スクリプト化はとても大きな助けとなるでしょう。
bashスクリプトとは?
bashはLinuxやmacOSで標準的に利用されるシェル環境で、コマンドラインで実行できる様々なコマンドをスクリプト形式で記述・実行できます。
#!/bin/bash は「このファイルはbashで実行しますよ」という宣言です。
スクリプトファイルにコマンドを書き込み、それを実行可能にすれば、ターミナルで一行ずつコマンドを打たなくても、スクリプト1本で一連の処理が行えます。
スクリプトの基本的な作り方
テキストエディタでファイルを作成(nano, vim, codeなどお好みで)
ファイルの先頭行に #!/bin/bash と書く
その下に実行したいコマンドを書く
例として、hello.shというスクリプトを作ってみましょう。
#!/bin/bash
echo "Hello from bash script!"
このhello.shを実行可能にするには以下のコマンドを実行します。
chmod +x hello.sh
その後、以下のように実行できます。
./hello.sh
画面に
Hello from bash script!
と表示されれば成功です。
echoと変数代入
スクリプト内で文字列を表示するにはechoコマンドを使います。変数を定義して利用することも簡単です。
#!/bin/bash
# 変数定義
name="neurouser"
echo "Hello, $name!"
$nameの部分が変数呼び出しです。上記スクリプトを実行すると、Hello, neurouser! と表示されます。
変数は=で代入できますが、=の前後にスペースは入れないことに注意してください。また、変数を使う際は$変数名と書くと、その値が参照できます。
簡単なif文
条件分岐は、スクリプトで複雑な処理をする上で重要です。ファイルの存在チェックや数値の比較など、状況に応じて処理を変えられます。
#!/bin/bash
filename="data.txt"
if [[ -f $filename ]]; then echo "$filename が見つかりました" else
echo "$filename は存在しません"
fi
-fは「ファイルが存在するか」をチェックする条件式です。このスクリプトを実行すると、data.txtがある場合は「見つかりました」と表示し、ない場合は「存在しません」と表示します。
forループで複数ファイルを処理する
forループを使うと、同じ処理を複数のファイルに対して繰り返し実行できます。
#!/bin/bash
# 現在のディレクトリにあるtxtファイルすべてに対して処理する例
for file in *.txt; do
echo "$file を処理中..."
# ここにfileに対して行いたい処理を書く
done
*.txtは「拡張子が.txtのすべてのファイル」を意味します。
このループ内で、file変数には順番に各ファイル名が代入され、echoで名前が表示されます。実際には、grepやcutなどを使ってファイル内容を処理することができます。
標準出力・標準エラー出力とリダイレクト
Linuxのコマンドは、結果を「標準出力(通常の出力)」と「標準エラー出力(エラー時の出力)」に分けて出します。
標準出力は>でファイルにリダイレクト可能
標準エラー出力をファイルにリダイレクトするには2>を使う
たとえば、コマンド結果をresult.txtに保存したい場合は以下のようにします。
ls > result.txt
ファイルが存在しなくてエラーが出るコマンドのエラーメッセージだけをerror.logに出したい場合は
ls no_such_file 2> error.log
とします。
grep, cut, awkなどのテキスト操作コマンドの基礎
grep: テキストの中から特定のパターンを検索
grep "pattern" filename
cut: テキストをフィールドごとに分割して特定部分のみ抽出
cut -d " " -f 2 filename
-dは区切り文字(delimiter)、-fはフィールド指定です。
awk: より複雑なテキスト処理が可能
awk '{print $2}' filename
この例は、各行の2番目のフィールドを表示します。
これらは組み合わせることで、テキストデータやコマンド出力を整形できます。
成果物例:条件分岐とループを含む短いスクリプト
例1:複数ファイルを一括処理して条件分岐
check_files.shというスクリプトを作り、同一ディレクトリ内にある.txtファイルすべてに対し「ファイルサイズが0なら空、そうでないなら中身がある」と表示するスクリプトを書いてみましょう。
#!/bin/bash
for file in *.txt; do
if [[ -s $file ]]; then
echo "$file はサイズが非0です"
else
echo "$file は空ファイルです"
fi
done
-sオプションはファイルサイズが非0なら真となります。
このスクリプトを実行すれば、現在のディレクトリにある.txtファイル全てを順番にチェックし、その状態を表示してくれます。
例2:grepやcutを使った簡易的なテキスト処理
例えば、data.csvというカンマ区切りのファイルから2列目のフィールドを抽出して表示するスクリプトextract_column.shを作ります。
#!/bin/bash
input_file="data.csv"
cut -d "," -f 2 $input_file > extracted_column.txt
echo "2列目のデータをextracted_column.txtに書き出しました"
このスクリプトを実行すると、data.csvの2列目だけがextracted_column.txtに抽出されます。
次回予告
今回は、#!/bin/bashで始まるスクリプトファイルを作る方法や、if文やforループなどの基本的な文法を学びました。また、grep、cut、awkといったテキスト操作コマンドを使い、コマンド出力を整形する入り口にも触れました。
これらは、今後「脳画像解析結果ファイルを自動で処理するスクリプト」を書く際に必須となる基礎力です。
次回は「脳画像データとFSLツールの基礎」へ踏み込み、NIfTI形式ファイルやfslhd、fslstatsなどのコマンドを学びながら、実際の脳画像ファイルから情報を抽出するスクリプト作りへと進んでいきます。