V1

シェルスクリプト入門

Copyright © Amelieff Corporation All Rights Reserved.

本講義にあたってテキストが穴埋めになっています
埋めて完成させてください

クイズがたくさんあります
めざせ全問正解！

実習がたくさんありますとにかく書いてみるのが理解の早道です

Copyright © Amelieff Corporation All Rights Reserved.

2

シェルスクリプトが導く
明るい未来

Copyright © Amelieff Corporation All Rights Reserved.

3

シェルスクリプトが導く明るい未来• あなたは解析担当者です• 今は朝の10時です• 共同研究者から一本の電話がかかってきました
例の解析結果が急に必要になったので
今日の18時までに送ってもらえる？

Copyright © Amelieff Corporation All Rights Reserved.

4

シェルスクリプトが導く明るい未来（無理だ...）

Copyright © Amelieff Corporation All Rights Reserved.

5シェルスクリプトが導く明るい未来

その解析はA,B,Cという3つのソフトを順番に実行する必要があるのですが...
A終わった B実行！

A実行！
A実行
(2時間)

B終わった C実行！
B実行
(3時間)

Copyright © Amelieff Corporation All Rights Reserved.

C実行(2.5時間)6

シェルスクリプトが導く明るい未来

今日に限って会議が2つも入っています
10

11

12

13

14

15

16

会議
A実行
(2時間)

17
会議

B実行
(3時間)

18

19
飲み会
C実行
(2.5時間)期限（18時までに終えるのは無理だ...）（締め切りを20時まで伸ばしてもらえるかな？）（飲み会は諦めよう）
Copyright © Amelieff Corporation All Rights Reserved.

7

シェルスクリプトが導く明るい未来

その時です

諦めないで！
シェルスクリプトを使えば18時までに終わるよ！
Copyright © Amelieff Corporation All Rights Reserved.

8

シェルスクリプトが導く明るい未来

シェルスクリプトのおかげであなたは共同研究者の要望に応え飲み会にも間に合いました
10

11

12

13

14

15

16

会議

A実行
(2時間)

17
会議

B実行
(3時間)

18

19
飲み会

C実行
(2.5時間)

シェルスクリプト作成
Copyright © Amelieff Corporation All Rights Reserved.

9シェルスクリプトを使うと時間を効率的に使える！

シェルスクリプトが導く明るい未来・完

Copyright © Amelieff Corporation All Rights Reserved.

10本講義の内容
シェルスクリプトとは

文法の話

• 変数
• 引数
• 条件付き処理• 繰り返し処理• 標準出力と標準エラー出力• シバン
Copyright © Amelieff Corporation All Rights Reserved.

11シェルスクリプトとは「Linuxコマンド」をファイルに書いたもの
書かれた内容をLinuxが自動実行
変数・条件付き処理・繰り返し処理などのプログラミングが可能

Copyright © Amelieff Corporation All Rights Reserved.

12シェルスクリプトのメリット
効率的に解析できる
指定通り自動で実行されるので、解析の待ち時間が減らせる
同じ処理を別のデータや異なる条件で繰り返し実行しやすい
実行ログを残しやすい
まとめて実行しておくね！
「cd」実行

cdpwd
ls「pwd」実行「ls」実行

手入力で1つずつコマンドを実行していたのを…

シェルスクリプトならまとめて実行できる！

Copyright © Amelieff Corporation All Rights Reserved.

13

シェルスクリプトの強み
バイオインフォのソフトは日進月歩
しかしLinuxコマンドや、シェルスクリプトの文法はこの10年大きくは変わっていない
つまり一度身につければ長く使える！
Copyright © Amelieff Corporation All Rights Reserved.

14

シェルとはユーザが入力したコマンドをコンピュー
タに伝えるプログラムです
再起動したまえ$ shutdown –h now
bash（再起動して～）zshなどの種類があります
シェル
（了解！）
スクリプト

Copyright © Amelieff Corporation All Rights Reserved.

15

シェルの種類

本テキストはzshをベースとした記述になっていますがbashでもほぼ同じ挙動になります
BioLinuxはデフォルトがzshです

Copyright © Amelieff Corporation All Rights Reserved.

16

シェルスクリプトの作成と実行
1. テキストエディタ（vi, gedit等）で実行内容をファイルに書いて保存
テキストエディタの使いかたは資料末尾をご覧ください

シェルスクリプトファイルは拡張子を「.sh」にします

2. shコマンドで実行$ sh シェルスクリプトファイル名

Copyright © Amelieff Corporation All Rights Reserved.

17

実習環境
1. 仮想環境を起動します
2. デスクトップに「sh」ディレクトリを作成します$ cd ~/Desktop$ mkdir sh$ cd sh

本日の実習はすべてこの中で行います
Copyright © Amelieff Corporation All Rights Reserved.

18

実習環境
テストデータデスクトップの「Sample Data」から「sh」に以下の2ファイルをコピーしてください「../S」だけ入力してTabキーを押すと「Sample¥ Data」まで入ります$ cp ../Sample¥ Data/peptide_seqs/p
eptides_longer_headers.fasta .
$ cp ../Sample¥ Data/peptide_seqs/p
eptides_short_headers.fasta .

改行を入れ
ずに続けて
入力
改行を入れ
ずに続けて
入力

どちらもFastaフォーマットのファイルです
Copyright © Amelieff Corporation All Rights Reserved.

19

Fastaフォーマット
＞で始まるID行と配列行（塩基またはアミノ酸）から成るフォーマットです
ゲノムや遺伝子の配列を表すのによく使われます
ID行>NP_571718.1|DRERSOX9A
MNLLDPYLKMTDEQEKCLSDAPSPSMSEDSAGSPCPSASGSDTENTRPAENSLLAADGTLGDF
配列行KKDEEDKFPVCIREAVSQVLKGYDWTLVPMPVRVNGSSKNKPHVKRPMNAFMVWAQAARRKLADQYPHLHNAELSKTLGKLWRLLNEVEKRPFVEEAERLRVQHKKDHPDYKYQPRRRKSVKNGQSESEDGSEQTHISPNAIFKALQQADSPASSMGEVHSPSEHSGQSQGPPTPPTTPKTDTQPGKADLKREARPLQENTGRPLSINFQDVDIGELSSDVIETFDVNEFDQYLPPNG：

Copyright © Amelieff Corporation All Rights Reserved.

20本講義の達成目標
以下の作業をシェルスクリプトで実行できるようになります「Fastaファイルから指定した遺伝子の配列だけを取り出す」

Copyright © Amelieff Corporation All Rights Reserved.

21

ファイルの先頭を表示する
Linuxのheadコマンドを実行すると、指定したファイルの先頭数行がhead –n k ファイル：
表示されますファイルの先頭k行を出力する$ head -n 4 peptides_short_headers.fasta>DRERSOX9A
MNLLDPYLKMTDEQEKCLSDAPSPSMSEDSAGSPCPSASGSDTENTRPAENS ・・
FPVCIREAVSQVLKGYDWTLVPMPVRVNGSSKNKPHVKRPMNAFMVWAQAAR ・・
LGKLWRLLNEVEKRPFVEEAERLRVQHKKDHPDYKYQPRRRKSVKNGQSESE ・・

先頭4行が表示される
Copyright © Amelieff Corporation All Rights Reserved.

22

実習1
次のシェルスクリプト・test1.shを書いて実行してみましょう
peptides_short_headers.fastaファイルの先頭4行を表示するスクリプト$ gedit test1.sh
test1.shにこの1行を書いて保存します

head –n 4 peptides_short_headers.fasta$ sh test1.sh
Copyright © Amelieff Corporation All Rights Reserved.

実行

23

質問
では、もう一つのファイル
peptides_longer_headers.fastaの﻿
先頭8行を表示するようにするにはスクリプトをどう変更すればよいでしょう？

Copyright © Amelieff Corporation All Rights Reserved.

24

解答
実行内容を以下のように変えますhead –n 4 peptides_short_headers.fasta

head –n 8 peptides_longer_headers.fasta

Copyright © Amelieff Corporation All Rights Reserved.

25

こんなときはどうする
ファイル名が何回も記載されていた場合は？
echo "peptides_short_headers.fastaの先頭4行は？"head –n 4 peptides_short_headers.fasta
echo "peptides_short_headers.fastaの末尾4行は？"tail –n 4 peptides_short_headers.fasta
echo "peptides_short_headers.fastaの行数
は？"
wc –l peptides_short_headers.fasta:
Copyright © Amelieff Corporation All Rights Reserved.

echo：値を出力する
tail –n k：
末尾k行を出力する
wc –l：行数を出力する

直すの面倒くさい！

直し忘れがありそう26

変数「 変数 」を使うと値を一元管理できます
FILE="peptides_short_headers.fasta"echo "$FILE の先頭4行は？"head –n 4 $FILE
変数「FILE」にファイル名を入れる

echo "$FILE の末尾4行は？"tail –n 4 $FILE

echo "$FILE の行数は？"
wc –l $FILE:
Copyright © Amelieff Corporation All Rights Reserved.

それ以降は「$FILE」と書くと設定した値が自動で入る！

27

変数「変数」は値を格納するものです
入れた値は変更することができます–「変数名=値」と書くと、変数に値を代入できます（文字列はダブルクオート(“)で囲みます）–「$変数」と書くと、変数に入っている値を呼び出すことができます
Copyright © Amelieff Corporation All Rights Reserved.

28

実習２
次のシェルスクリプト・test2.shを書いて実行してみましょう$ cp test1.sh test2.sh cp FileA FileB：
FileAをFileBという名前で複製$ gedit test2.sh
test2.shを以下のように変更して保存します

file="peptides_short_headers.fasta"
num=4
head –n $num $file$ sh test2.sh
Copyright © Amelieff Corporation All Rights Reserved.

29

実習２・解答
実習1と同じ挙動になります
file="peptides_short_headers.fasta"
num=4
head –n $num $file

1. 変数「file」にファイル名を入れる
2. 変数「num」に表示したい行数を入れる
3. headコマンドを$num, $fileを使って実行する
Copyright © Amelieff Corporation All Rights Reserved.

30変数のありがたみがわかる例
変数を使わずに書いたスクリプトの例
echo "入力ファイルは A.fastq です"echo "A.fastq のマッピング開始"
bwa mem genome A.fastq >out.sam
echo "A.fastq のマッピング終了":
何箇所も直さないといけない…

やっぱり
A.fastqじゃなくB.fastqで実行しよう！

時間がかかる上に直し忘れたりする
Copyright © Amelieff Corporation All Rights Reserved.

31変数のありがたみがわかる例
変数を使って書いたスクリプトの例
file="A.fastq"
echo "入力ファイルは $file です"echo "$file のマッピング開始"
bwa mem genome $file >out.sam
echo "$file のマッピング終了"
:

ここだけ
直せばよい

10秒で
直せます！

やっぱり
A.fastqじゃなくB.fastqで実行しよう！

Copyright © Amelieff Corporation All Rights Reserved.

32

変数にしたほうがいいもの
実行のたびに変わる可能性のある値例）「 入力ファイル名 」
スクリプト内に何度も登場する値
ゲノム配列の例）「」
ファイル名
なるべく変数にしておくと後で修正がしやすい
Copyright © Amelieff Corporation All Rights Reserved.

33

不満

対象ファイルが変わるたびにスクリプトファイル内のファイル名の値を書き換えないといけないのは面倒だなあ

peptides_longer_headers.fasta
file=peptides_short_headers.fasta
num=4
head –n $num $file「 引数 」を使うと実行するファイル名などを外から与えられるようになります
Copyright © Amelieff Corporation All Rights Reserved.

34

引数
ひきすう

「引数」は実行時にスクリプト名以降に入力された値（空白区切りで複数入力可）です$ sh test3.sh peptides_short_headers.fasta 4 ...
引数

引数の値は専用の変数に入ります
変数$1に1番目の値が、$2に2番目の値が（$3以下同様）入ります
Copyright © Amelieff Corporation All Rights Reserved.

35

実習３
次のシェルスクリプト・test3.shを書いて実行してみましょう$ cp test2.sh test3.sh$ gedit test3.sh
以下のように変更して保存

file=$1
num=$2head –n $num $file

引数にファイル名と行数を指定して実行$ sh test3.sh peptides_short_headers.fasta 4
Copyright © Amelieff Corporation All Rights Reserved.

36

実習３・解答
実習1・２と同じ挙動になります$ sh test3.sh peptides_short_headers.fasta 4

file=$1
num=$2head –n $num $file

1番目の値（peptides...）が変数$1に2番目の値（4）が変数$2に入ります

引数を変えると実行内容が変わります$ sh test3.sh peptides_longer_headers.fasta 10

Copyright © Amelieff Corporation All Rights Reserved.

37難易度：★

Q1.sh

クイズ
実行結果は
どうなりますか？

v1=$1
v2=$2
v3=$3

★：基本です★★：理解できています★★★：解けたらすごい

echo $v2$ sh Q1.sh I love bioinformatics

AC

I love bioinformatics

love

B

D

I

bioinformatics
Copyright © Amelieff Corporation All Rights Reserved.

38

Q1.sh

クイズ
正解は、

C！！

v1=$1
v2=$2
v3=$3
echo $v2

love$ sh Q1.sh I love bioinformatics
1つ目の値→$1に入る

2つ目の値→$2に入る

Copyright © Amelieff Corporation All Rights Reserved.

3つ目の値→$3に入る39

ディレクトリを作成する
以下は「sun」「moon」という名前の2つのディレクトリを作成する
シェルスクリプトですmkdir "sun" "moon"

mkdir：
ディレクトリを作成する

Copyright © Amelieff Corporation All Rights Reserved.

40

実習４
次のシェルスクリプト・test4.shを書いて実行してみましょう– "sun"と"moon"というディレクトリを作成する– ディレクトリ名は引数で指定する$ sh test4.sh sun moon
$ ls
sunとmoonができていればOK！

ls：ファイルと ディレ
クトリの一覧を表示

もう一度実行してみましょう$ sh test4.sh sun moon
Copyright © Amelieff Corporation All Rights Reserved.

警告が出るはずです41

実習４・解答
dir1=$1
dir2=$2
mkdir $dir1
mkdir $dir2$ sh test4.sh sun moon
$ ls

同じコマンドを再実行すると警告が出ますmkdir: ディレクトリ 'sun' を作成できません: ファイルが存在します
mkdir: ディレクトリ 'moon' を作成できません: ファイルが存在します
Copyright © Amelieff Corporation All Rights Reserved.

42

質問
ディレクトリが存在する場合に警告を出さなくするには
どうしたらいいの？

「

条件付き処理」を用います

作ろうとする名前のディレクトリが存在しない時のみmkdirするようにします
Copyright © Amelieff Corporation All Rights Reserved.

43条件付き処理
条件を満たした時だけ処理を実行させることができますif␣ [␣条件␣]
then
～処理～
fi

␣：半角スペースを入れる（実際は表示されない）

ここに空白がないとエラーになるので注意

処理文は少し行頭を下げる（インデント）と見やすい
Copyright © Amelieff Corporation All Rights Reserved.

44

ファイルFILが存在してかつ通常ファイルなら条件付き処理if [ -f FIL ]ファイル・ディレクトリの存在確認
ファイルFILが存在すればファイルFILが存在してかつサイズが0でなければ

if [ -e FIL ]if [ -s FIL ]ディレクトリDIRが存在すればディレクトリDIRが存在しなければ

if [ -d DIR ]if [ ! -d DIR ]Copyright © Amelieff Corporation All Rights Reserved.

45

実習５
次のシェルスクリプト・test5.shを書いて実行してみましょう
2つの好きな名前のディレクトリを作成する
ディレクトリ名は引数で受け取る
ディレクトリが存在しない場合のみmkdirする

同じコマンドを繰り返し実行しても警告が出ないことを確認します
Copyright © Amelieff Corporation All Rights Reserved.

46

実習５・解答

1回目の実行$ sh test5.sh DNA RNA
dir1=$1
dir2=$2
if [ ! -d $dir1 ]thenmkdir $dir1
fi
if [ ! -d $dir2 ]thenmkdir $dir2
fi

DNAが存在しないのでifの中が実行される→DNAができるRNAが存在しないのでifの中が実行される

Copyright © Amelieff Corporation All Rights Reserved.

→RNAができる47

実習５・解答

2回目の実行$ sh test5.sh DNA RNA
dir1=$1
dir2=$2
if [ ! -d $dir1 ]thenmkdir $dir1
fi
if [ ! -d $dir2 ]thenmkdir $dir2
fi

DNAが存在するのでifの中が実行されない→警告が出ない
RNAが存在するのでifの中が実行されない

Copyright © Amelieff Corporation All Rights Reserved.

→警告が出ない48

質問

条件付き処理では他にどんな条件が指定できるの？

変数の値に応じた処理などが可能です例）変数Aが100より大きければ例）変数Bが"cancer"でなければCopyright © Amelieff Corporation All Rights Reserved.

49条件付き処理値の比較には「比較演算子」を使います
文字列の比較演算子

数値の比較演算子

A -eq BA -ne BA -lt BA -le BA -ge BA -gt B

A＝Bなら
A≠Bなら
A＜Bなら
A≦Bなら
A≧Bなら
A＞Bなら

A=B

AとBが
同じなら

A != B

AとBが異なれば

Copyright © Amelieff Corporation All Rights Reserved.

50条件付き処理
変数を使った条件付き処理
変数TEMPERATUREが30以上だったら

TEMPERATURE=$1
if [ $TEMPERATURE -ge 30 ]thenecho "Is it hot today?"fi「Is it hot today?」と出力

Copyright © Amelieff Corporation All Rights Reserved.

51条件付き処理
複数の条件を指定することもできます

elif は何回でも記述可能

if [ 条件1 ]then～条件1を満たした時の処理～
elif [ 条件2 ]then～条件1は満たさなかったが、条件2を満たした時の処理～
else～どの条件も満たさなかった
時の処理～
fi
Copyright © Amelieff Corporation All Rights Reserved.

52条件付き処理
複数の条件付き処理の例
TEMPERATURE=$1
if [ $TEMPERATURE -ge 30 ]thenecho "Hot enough for you?"elif [ $TEMPERATURE -le 10 ]thenecho "Cold enough for you?"else
echo "It's a nice day
today."fi
Copyright © Amelieff Corporation All Rights Reserved.

TEMPERATUREが30以上だったら

TEMPERATUREが10以下だったら

TEMPERATUREがそれ以外だったら53

実行結果は
どうなりますか？

難易度：★★
Q2.sh
mkdir "dir3"
cd "dir3"
if [ ! -f "foo.txt" ]thentouch "foo.txt"
else
echo "It already exists."fi

実行開始時点でdir3は存在しない
ものとします$ sh Q2.sh

クイズ

A

C

「It already exists.」と出力される

dir3のみ作成される

B

D

dir3と
foo.txtが作成される

エラーになる

Copyright © Amelieff Corporation All Rights Reserved.

54

クイズ
正解は、

B！！

dir3と
foo.txtが作成される

Q2.sh
mkdir "dir3"
cd "dir3"
if [ ! -f "foo.txt" ]thentouch "foo.txt"
else
echo "It already exists."fi$ sh Q2.sh
Q2.sh別解mkdir "dir3"
cd "dir3"
if [ ! -f "foo.txt" ];then
右のようにIf文でセミコロン（；）
touch "foo.txt"
を使うと1行に書くことができます else
echo "It already exists."fi
Copyright © Amelieff Corporation All Rights Reserved.

55

実習５を再度見てみましょう
dir1=$1
dir2=$2
if [ !-d $dir1 ]thenmkdir $dir1
fi
if [ !-d $dir2 ]thenmkdir $dir2
fi

なんとなく冗長な感じがしませんか？

Copyright © Amelieff Corporation All Rights Reserved.

56

不満

ディレクトリを100個作る場合はif [ !-d $dir1 ]thenmkdir $dir1
fi

を100回

書かないといけなくて大変だ！

「 繰り返し処理 」を用いれば、何度も実行する処理でも1回だけ書くだけでよくなりますCopyright © Amelieff Corporation All Rights Reserved.

57

繰り返し処理繰り返し処理の構文
for␣変数␣in␣値1 値2 値3 …
do
～処理～
done

Copyright © Amelieff Corporation All Rights Reserved.

58

繰り返し処理繰り返し処理の例「1.txt」「2.txt」...「100.txt」という名前のファイルをtouchコマンドで作成する

for FILE in `seq 1 100`dotouch $FILE".txt"
done

Copyright © Amelieff Corporation All Rights Reserved.

touch:
ファイルを作成する`seq n m`:
nからmまで1刻みの数

59

Q3.shf1=$1
f2=$2
out=$3

クイズ
実行結果はどうなりますか？

難易度：★★

for f in $f1 $f2
dohead -n 2 $f > $out
done

$ sh Q3.sh File1 File2 Out

A

C

File1の先頭2行がOutに出力される

File2の先頭2行がOutに
出力される

B

D

File1の先頭2行とFile2の先頭2行がOutに出力される

エラーになる

Copyright © Amelieff Corporation All Rights Reserved.

60

Q3.shf1=$1
f2=$2
out=$3

クイズ
正解は、

C！！

for f in $f1 $f2
dohead -n 2 $f > $out
done

File2の先頭2行がOutに出力される
Q3.sh修正版
f1=$1
f2=$2
【参考】ファイルに追記するには out=$3>を>>にすると
ファイル書き出しが追記になりfor f in $f1 $f2
File1の先頭2行の次に、
do
File2のf2の先頭2行がhead -n 2 $f >> $out
出力されますdone
Copyright © Amelieff Corporation All Rights Reserved.

61

実習６
次のシェルスクリプト・test5.shを書いて実行してみましょう– 3つの好きな名前のディレクトリを作成する– ディレクトリ名は引数で受け取る– ディレクトリが存在しない場合のみmkdirする– ディレクトリを作成する手順はfor文を使って1回だけ記述する
Copyright © Amelieff Corporation All Rights Reserved.

62

実習６・解答例
dir1=$1
dir2=$2
dir3=$3
for dir in $dir1 $dir2 $dir3
doif [ ! -d $dir ]何度も実行する処理だがthen
書くのは一回だけなので楽mkdir $dirfi
処理内容に変更があってもdone
ここだけ変更すればよい
Copyright © Amelieff Corporation All Rights Reserved.

63

もっと便利にする
どのコマンドが実行されたか
実行結果が正しく終わったのか
わかりづらいよ実行コマンドをechoで出力すると結果がわかりやすくなります
file=$1
echo "$file のマッピング開始"
bwa mem genome $file >out.sam $ sh bwa.sh B.fastq
B.fastqのマッピング開始
echo "$file のマッピング終了"
B.fastqのマッピング終了
Copyright © Amelieff Corporation All Rights Reserved.

64もっと便利にするexitで処理を終了できます
for i in `seq 1 10`;doecho $iif [ $i –eq 3 ];thenecho 'Duh!'
exit
fi
done

$ sh duh.sh
1
2
3
Duh!

Copyright © Amelieff Corporation All Rights Reserved.

65標準出力と標準エラー出力
正常時の出力と、エラー時の出力を区別して出すことができます$ sh miso_soup.sh

ネギを切りました
豆腐を切りました
お湯が沸きました
ネギと豆腐を投入しました
エラー！味噌が見つかりません
終了します

Copyright © Amelieff Corporation All Rights Reserved.

エラー時の出力は区別できるようにしたい
66

標準出力と標準エラー出力
通常のechoの結果は「標準出力」へ、末尾に「>&2」をつけてechoした結果
は「標準エラー出力」へ出力されますecho "OK!"echo "ERROR！" >&2

標準出力へ
標準エラー出力へ

Copyright © Amelieff Corporation All Rights Reserved.

67

実習７
次のシェルスクリプト・test7.shを書いて実行してみましょう
echo "I'm fine."echo "Something wrong." >&2

実行結果の違いを確認します
どちらも画面に出力する$ sh test7.sh$ sh test7.sh 1>log 2>err$ sh test7.sh >logall 2>&1

標準出力はファイルlogへ、
標準エラー出力はファイル
errへ出力する

どちらもファイルlogallへ
Copyright © Amelieff Corporation All Rights Reserved.
出力する
68

不満
他人のスクリプトはもちろん、自分で書いたスクリプトでも後で読み返すと何をやっているのかわからなくなるよ

何をやっているかわかりやすくするため
スクリプトに「 コメント 」を入れましょう

Copyright © Amelieff Corporation All Rights Reserved.

69

コメント
#で始まる行はコメント扱いとなり、処理に影響しません# 日本語でお礼
echo "Arigatou"# 英語でお礼
echo "Thank you"

コメント

コメント

Copyright © Amelieff Corporation All Rights Reserved.

70

シバン
スクリプトの1行目に以下を記述すると
このファイルがシェルスクリプトである
ことが明示的になります#!/bin/sh

スクリプトの1行目に書く何で実行するかの指定をシバンと言います

これにより、shコマンドなしでも実行できるようになります$ chmod a+x test7.sh$ ./test7.sh

chmod a+x：実行権限をつける

Copyright © Amelieff Corporation All Rights Reserved.

71

Q4.sh

難易度：★ ★

#!/bin/sh

クイズecho "Humpty "echo "Dumpty " >&2echo "sat on "exit
echo "a wall" >&2

実行結果はどうなるでしょう？

$ chmod a+x Q4.sh$ ./Q4.sh 2>egg.txt

AC

egg.txtに以下が出力される
Humpty sat on

egg.txtに以下が出力される
Humpty Dumpty sat on a wallBD

egg.txtに以下が出力されるDumpty

エラーになる

Copyright © Amelieff Corporation All Rights Reserved.

72

解答

B！

正解は、

#!/bin/shecho "Humpty "echo "Dumpty " >&2echo "sat on "exit
echo "a wall" >&2

Copyright © Amelieff Corporation All Rights Reserved.

標準出力
標準エラー出力

標準出力
ここで終了

73

cdbtools
Fastaファイルを操作するソフトウェアです
https://umbc.rnet.missouri.edu/resources/How2RunCdbtools.html

以下の2コマンドからなります
1. cdbfasta：Fastaにインデックスをつける（前準備）
2. cdbyank：Fastaから指定した配列を取り出す
実行例（peptides_short_headers.fastaからDRERSOX9Aの配列を取り出す）：$ cdbfasta peptides_short_headers.fasta$ cdbyank -a 'DRERSOX9A' peptides_short_headers.fasta.cidx

Copyright © Amelieff Corporation All Rights Reserved.

74

最終課題（1/2）
「peptides_short_headers.fastaから、DRERSOX9A遺伝子の配列だけを抜き出す」$ grep '>' peptides_short_headers.fasta>DRERSOX9A>CAURSOX9A>OMYKSOX9>OLATSOX9B>TNIGUnk>XTRPSOX9>RRUGSOX9A>DRERSOX9B>CCARSOX9B>CAURSOX9B>TNIGUnm>ASTUSOX9>HSAPSOX9

peptides_short_headers.fastaに書かれている遺伝子名の一覧>DRERSOX9A
MNLLDPYLKMTDEQEKCLSDAPSPSMSEDSAGSPCPSASGSDTENTRPAENSLLAADGTLGDFKKDEEDKFPVCIREAVSQVLKGYDWTLVPMPVRVNGSSKNKPHVKRPMNAFMVWAQAARRKLADQYPHLHNAELSKTLGKLWRLLNEVEKRPFVEEAERLRVQHKKDHPDYKYQPRRRKSVKNGQSESEDGSEQTHISPNAIFKALQQADSPASSMGEVHSPSEHSGQSQGPPTPPTTPKTDTQPGKADLKREARPLQENTGRPLSINFQDVDIGELSSDVIETFDVNEFDQYLPPNGHQNAPYAGGYAAWMTKPQNGSPQSSQLTPLNPAEPDQPRTTHIKTEQLSPSHYNEQQGSPQHISYGSFNVQHLQHYSTSFPSITRAQYDYSDSHQGGASSYYTHAGGQSSGLYSTFSYM
SSSQRPMYTPIADSTGVPSIPQSNHSPQHWDQQPVYTQLSRP

Copyright © Amelieff Corporation All Rights Reserved.

75

最終課題（2/2）
次のシェルスクリプト・test8.shを書いて実行します1. Fastaファイル名をコマンドラインから引数で受け取り変数FASTAに入れる
FASTA=$1
﻿
2. $FASTAの値をechoし、指定した値が入っていることを確認する
echo $FASTA﻿$ sh test8.sh peptides_short_headers.fasta↑まずはここまでやってみましょう
3. $FASTAに対し、以下のコマンドでインデックスを作成する
cdbfasta $FASTA
4. 変数CIDX、変数OUTに以下の文字列を入れ、echoで確認
CIDX="${FASTA}.cidx"
﻿＜応用編＞
・シバンをつける
OUT="${FASTA}.sub.fasta"
・FASTAの存在確認を行い、存在
echo $CIDX, $OUT
しない場合は標準エラー出力に
エラーメッセージを出して終了する
5. $CIDXに対し、以下のコマンドで配列を取り出す
・遺伝子名も引数で受け取るようにし、
cdbyank -a 'DRERSOX9A' -o $OUT $CIDX
﻿
別の遺伝子に変えて実行する
6. 3と5のコマンド文を実行前にechoする$ sh test8.sh peptides_short_headers.fasta
Copyright © Amelieff Corporation DRERSOX9A
All Rights Reserved.>log 2>err

76

現在いる場所を確認する【pwd】
現在Linuxのどのディレクトリにいるか確認するには次のコマンドを
実行します
$ pwd

コマンドを入力した後、Enterキーを押すとコマンドが実行されますデ ィ レ ク ト リ 内 を 確 認 す る 【 l s 】
現在いる場所にどのようなファイル・ディレクトリがあるか確認するには次のコマンドを実行します$ ls -l-lをつけて実行するとlsだけを実行するより詳しい結果が表示されます（アクセス権限など）-lを「オプション」と呼びます

他 の デ ィ レ ク ト リ に 移 動 す る 【 c d 】
他のディレクトリに移動するには次のコマンドを実行します$ cd 移動先ディレクトリ

コマンドとオプションの間、コマンドと値の間には半角空白を1つ以上入れます
Copyright © Amelieff Corporation All Rights Reserved.

77ディレクトリを作成する【mkdir】$ mkdir 移動先ディレクトリフ ァ イ ル を 作 成 す る 【 t o u c h 】$ touch 作成するファイル名

ファイルを閲覧するにはlessやmore、
ファイルを編集するにはgeditやviを使いますフ ァ イ ル を 編 集 す る 【 g e d i t 】$ gedit 編集するファイル名

ファイルが存在しない場合は新規作成されます
GUI環境がない場合はviを使います

Copyright © Amelieff Corporation All Rights Reserved.

78

ファイルまたはディレクトリをコピーする【cp】$ cp ファイル名|ディレクトリ名 コピー先名

フ ァ イ ル ま た は デ ィ レ ク ト リ を 移 動 す る 【 m v 】$ mv ファイル名|ディレクトリ名 コピー先名

ア ク セ ス 権 限 を 変 更 す る 【 c h m o d 】$ chmod 付与する権限 ファイル名|ディレクトリ名
権限の例）755：全員に読み書き実行を許可、700：所有者のみに読み書き実行を許可

Copyright © Amelieff Corporation All Rights Reserved.

79

主な解凍コマンド
拡張子.tar.gz

圧縮形式
gzip

コマンド
$ tar zxvf ファイル名.tar.bz2

bzip2$ tar jxvf ファイル名

.gz

gzip

$ gunzip ファイル名$ gzip -d ファイル名$ bunzip2 ファイル名

.bz2

bzip2

.zip

zip

$ unzipファイル名

.tar

tar

$ tar xvf ファイル名$ bzip2 -d ファイル名

Copyright © Amelieff Corporation All Rights Reserved.

80Linuxのテキストエディタ
GUIのエディタとCUIのエディタがあります

GUI：Windows/Macソフトのように、マウスで操作する
長所：Linux初心者にも操作が容易
短所：GUIがない環境では使えない

CUI：キーボードからコマンドで操作する
長所：GUIがない環境でも使える
短所：操作コマンドを覚える必要がある

Copyright © Amelieff Corporation All Rights Reserved.

81

gedit
CentOSにはデフォルトでgeditというGUIエディタが入っていますgeditを起動するには$ gedit

コマンドを実行します「×」をクリックして終了します「保存」をクリックして保存します

Copyright © Amelieff Corporation All Rights Reserved.

82

vi
CentOSにはデフォルトでviというCUIエディタが入っています

viを起動するには$ vi

コマンドを実行します

viには2つのモードがあり、モードを切り替えながら操作します
入力モード：文字を入力する

コマンドモード：編集する（切り貼り、ファイルの保存など）
コマンドモード

入力モード

Copyright © Amelieff Corporation All Rights Reserved.

83

vi
入力モードのコマンド
Escキー

コマンドモードに移行

コマンドモードのコマンドa

入力モードに移行（カーソルの右から入力）

o

入力モードに移行（次の行の行頭から入力）

x

1文字カットdd

今いる行をカット

yy

１行コピー

p

カットした行をペースト[数字]g[数字]行に移動

G

最終行に移動:%s/foo/bar/

文字列置換（fooをbarに置換）

Copyright © Amelieff Corporation All Rights Reserved.

84