「シェルスクリプトの基礎 - ファイルとディレクトリ」の版間の差分
細 (文字列「source lang」を「syntaxhighlight lang」に置換) |
|||
7行目: | 7行目: | ||
if文の演算子で、-eを使用することでファイルが存在することを確認することができる。<br> | if文の演算子で、-eを使用することでファイルが存在することを確認することができる。<br> | ||
以下のシェルスクリプトでは、test.txtファイルが存在するか確認して、ファイルが存在する場合、File exists.と表示する。<br> | 以下のシェルスクリプトでは、test.txtファイルが存在するか確認して、ファイルが存在する場合、File exists.と表示する。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
21行目: | 21行目: | ||
つまり、! -eと記述することで、ファイルが存在しない場合に真となる。<br> | つまり、! -eと記述することで、ファイルが存在しない場合に真となる。<br> | ||
以下のシェルスクリプトでは、test.txtファイルが存在しない場合に、File not exists.と表示する。<br> | 以下のシェルスクリプトでは、test.txtファイルが存在しない場合に、File not exists.と表示する。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
37行目: | 37行目: | ||
if文の演算子で、-dを使用することでディレクトリが存在することを確認することができる。<br> | if文の演算子で、-dを使用することでディレクトリが存在することを確認することができる。<br> | ||
以下のシェルスクリプトでは、testディレクトリが存在する場合、Directory exists.と表示する。<br> | 以下のシェルスクリプトでは、testディレクトリが存在する場合、Directory exists.と表示する。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
51行目: | 51行目: | ||
つまり、! -dと記述することで、ディレクトリが存在しない場合に真となる。<br> | つまり、! -dと記述することで、ディレクトリが存在しない場合に真となる。<br> | ||
以下のシェルスクリプトでは、testディレクトリが存在しない場合に、Directory not exists.と表示する。<br> | 以下のシェルスクリプトでは、testディレクトリが存在しない場合に、Directory not exists.と表示する。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
131行目: | 131行目: | ||
ワイルドカード(*)を使用して、カレントディレクトリ内のファイルを順に処理することができる。 | ワイルドカード(*)を使用して、カレントディレクトリ内のファイルを順に処理することができる。 | ||
以下の例では、全てのファイルを繰り返し処理している。 | 以下の例では、全てのファイルを繰り返し処理している。 | ||
< | <syntaxhighlight lang="sh"> | ||
for FILENAME in *; do | for FILENAME in *; do | ||
echo "$FILENAME" | echo "$FILENAME" | ||
139行目: | 139行目: | ||
特定の拡張子を持つファイルのみを列挙する場合は、以下のように記述する。 | 特定の拡張子を持つファイルのみを列挙する場合は、以下のように記述する。 | ||
以下の例では、全てのPNGファイルを繰り返し処理している。 | 以下の例では、全てのPNGファイルを繰り返し処理している。 | ||
< | <syntaxhighlight lang="sh"> | ||
for PNGFILE in *.png; do | for PNGFILE in *.png; do | ||
echo "$PNGFILE" | echo "$PNGFILE" | ||
146行目: | 146行目: | ||
<br> | <br> | ||
また、次のように1行で記述することもできる。 | また、次のように1行で記述することもできる。 | ||
< | <syntaxhighlight lang="sh"> | ||
for PNGFILE in *.png; do echo "$PNGFILE"; done | for PNGFILE in *.png; do echo "$PNGFILE"; done | ||
</source> | </source> | ||
153行目: | 153行目: | ||
以下の例では、findコマンドで検索したファイルを、while文で順に処理している。 | 以下の例では、findコマンドで検索したファイルを、while文で順に処理している。 | ||
深い階層にあるファイルも再帰的に処理される。 | 深い階層にあるファイルも再帰的に処理される。 | ||
< | <syntaxhighlight lang="sh"> | ||
find . -type f | while read FILENAME; do | find . -type f | while read FILENAME; do | ||
echo "$FILENAME" | echo "$FILENAME" | ||
171行目: | 171行目: | ||
==== テキストファイルを1行のみ読み込む ==== | ==== テキストファイルを1行のみ読み込む ==== | ||
readコマンドは、ユーザからの入力の他に、ファイルからの入力を1行のみ読み込むことができる。<br> | readコマンドは、ユーザからの入力の他に、ファイルからの入力を1行のみ読み込むことができる。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
# 実行 | # 実行 | ||
read line < list.txt | read line < list.txt | ||
183行目: | 183行目: | ||
ファイルを標準入力へリダイレクトさせて、ファイル内容を1行ずつ読み込ませる。<br> | ファイルを標準入力へリダイレクトさせて、ファイル内容を1行ずつ読み込ませる。<br> | ||
以下の例では、list.txtファイルの内容を読み込み、1行ずつechoコマンドで表示させている。<br> | 以下の例では、list.txtファイルの内容を読み込み、1行ずつechoコマンドで表示させている。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
# 実行 | # 実行 | ||
while read line | while read line | ||
199行目: | 199行目: | ||
ファイル内容をcatコマンドで表示させて、それを変数に格納し、ヒアドキュメントを使用して読み込む。<br> | ファイル内容をcatコマンドで表示させて、それを変数に格納し、ヒアドキュメントを使用して読み込む。<br> | ||
以下の例では、list.txtファイル内容を変数DATAに格納して、ヒアドキュメントを使用して変数の内容を読み込んでいる。<br> | 以下の例では、list.txtファイル内容を変数DATAに格納して、ヒアドキュメントを使用して変数の内容を読み込んでいる。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
DATA=`cat ./list.txt` | DATA=`cat ./list.txt` | ||
while read line | while read line | ||
217行目: | 217行目: | ||
ファイル内容をcatコマンドで表示させて、その結果をパイプを使用して読み込む。<br> | ファイル内容をcatコマンドで表示させて、その結果をパイプを使用して読み込む。<br> | ||
以下の例では、lixt.txtファイルの内容をcatコマンドで表示させて、その結果をパイプでwhile readコマンドに渡している。<br> | 以下の例では、lixt.txtファイルの内容をcatコマンドで表示させて、その結果をパイプでwhile readコマンドに渡している。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
# 実行 | # 実行 | ||
cat ./list.txt | while read line | cat ./list.txt | while read line |
2021年11月24日 (水) 18:06時点における版
概要
シェルスクリプトにおいて、ファイルとディレクトリに関する処理を記載する。
ファイルの存在を確認
ファイルが存在する場合
if文の演算子で、-eを使用することでファイルが存在することを確認することができる。
以下のシェルスクリプトでは、test.txtファイルが存在するか確認して、ファイルが存在する場合、File exists.と表示する。
#!/bin/bash
FILE="test.txt"
if [ -e $FILE ]; then
echo "File exists."
fi
</source>
<br>
===== ファイルが存在しない場合 =====
上記と逆の場合、ファイルが存在しないことを確認する場合、演算子に!を付加することで結果を反転させることができる。<br>
つまり、! -eと記述することで、ファイルが存在しない場合に真となる。<br>
以下のシェルスクリプトでは、test.txtファイルが存在しない場合に、File not exists.と表示する。<br>
<syntaxhighlight lang="sh">
#!/bin/bash
FILE="test.txt"
if [ ! -e $FILE ];then
echo "File not exists."
exit -1
fi
</source>
<br><br>
== ディレクトリの存在を確認 ==
===== ディレクトリが存在する場合 =====
if文の演算子で、-dを使用することでディレクトリが存在することを確認することができる。<br>
以下のシェルスクリプトでは、testディレクトリが存在する場合、Directory exists.と表示する。<br>
<syntaxhighlight lang="sh">
#!/bin/bash
DIR="test"
if [ -d $DIR ];then
echo "Directory exists."
fi
</source>
<br>
===== ディレクトリが存在しない場合 =====
上記と逆の場合、ディレクトリが存在しないことを確認する場合、演算子に!を付加することで結果を反転させることができる。<br>
つまり、! -dと記述することで、ディレクトリが存在しない場合に真となる。<br>
以下のシェルスクリプトでは、testディレクトリが存在しない場合に、Directory not exists.と表示する。<br>
<syntaxhighlight lang="sh">
#!/bin/bash
DIR="test"
if [ ! -d $DIR ];then
echo "Directory not exists."
exit -1
fi
</source>
<br><br>
== コマンドを使用した確認 ==
ワイルドカードを指定してファイルおよびディレクトリを確認することができる。<br>
ファイル名およびディレクトリ名にワイルドカードを指定して存在を確認する場合、以下のように記述する。(例 : txt拡張子を持つファイル等)<br>
<br>
以下の例では、<code>ls *.txt</code>コマンドは、txt拡張子のファイルが存在する場合、なんらかの文字列を返すため、if文の判定は真となる。<br>
txt拡張子のファイルが存在しない場合、エラーが発生するので、<code>/dev/null</code>にリダイレクトしている。<br>
<syntaxhighlight lang="sh">
if ls *.txt > /dev/null 2>&1; then
echo "exists"
fi
その他の演算子
下表に、ファイルやディレクトリの存在を確認する際に、使用できる演算子を記載する。
表. 演算子
演算子 | 説明 |
---|---|
-a ファイル | ファイルがあれば真 |
-b ファイル | ファイルがありブロックス特殊ファイルであれば真 |
-c ファイル | ファイルがありキャラクター特殊ファイルであれば真 |
-d ファイル | ファイルがありディレクトリであれば真 |
-e ファイル | ファイルがあれば真 |
-f ファイル | ファイルがあり通常のファイルであれば真 |
-g ファイル | ファイルがありSGID(特殊なアクセス権)であれば真 |
-G ファイル | ファイルがあり実行グループIDによる所有者であれば真 |
-h ファイル | ファイルがありシンボリックであれば真(-Lと同じ) |
-k ファイル | ファイルがありステッキービットが設定されていれば真 |
-L ファイル | ファイルがありシンボリックであれば真(-hと同じ) |
-O ファイル | ファイルがあり実行ユーザIDによる所有者であれば真 |
-p ファイル | ファイルがあり名前付きパイプであれば真 |
-r ファイル | ファイルがあり読み取り可能であれば真 |
-s ファイル | ファイルがありサイズが0より大きければ真 |
-S ファイル | ファイルがありソケットであれば真 |
-t FD | FD(ファイルディスクリプタ)が端末でオープンされていれば真 |
-u ファイル | ファイルがありSUID(特殊なアクセス権)であれば真 |
-w ファイル | ファイルがあり書き込み可能であれば真 |
-x ファイル | ファイルがあり実行可能であれば真 |
ファイルの処理
ワイルドカードの使用
ワイルドカード(*)を使用して、カレントディレクトリ内のファイルを順に処理することができる。 以下の例では、全てのファイルを繰り返し処理している。
<syntaxhighlight lang="sh"> for FILENAME in *; do echo "$FILENAME" done </source>
特定の拡張子を持つファイルのみを列挙する場合は、以下のように記述する。
以下の例では、全てのPNGファイルを繰り返し処理している。
<syntaxhighlight lang="sh"> for PNGFILE in *.png; do echo "$PNGFILE" done </source>
また、次のように1行で記述することもできる。
<syntaxhighlight lang="sh"> for PNGFILE in *.png; do echo "$PNGFILE"; done </source>
findコマンドの結果の使用(再帰処理)
以下の例では、findコマンドで検索したファイルを、while文で順に処理している。 深い階層にあるファイルも再帰的に処理される。
<syntaxhighlight lang="sh"> find . -type f | while read FILENAME; do echo "$FILENAME" done </source>
テキストファイルの読み込み
while文とreadコマンドを組み合わせて使用すると、テキストファイルの内容を1行ずつ処理できる。
このセクションでは、以下に示すlist.txtファイルを使用する。
# list.txtファイルの内容 one two three
テキストファイルを1行のみ読み込む
readコマンドは、ユーザからの入力の他に、ファイルからの入力を1行のみ読み込むことができる。
<syntaxhighlight lang="sh"> # 実行 read line < list.txt echo "$line" # 出力 AAA 100 </source>
標準入力へリダイレクトさせて読み込む
ファイルを標準入力へリダイレクトさせて、ファイル内容を1行ずつ読み込ませる。
以下の例では、list.txtファイルの内容を読み込み、1行ずつechoコマンドで表示させている。
<syntaxhighlight lang="sh"> # 実行 while read line do echo $line done < ./list.txt # 出力 one two three </source>
ファイルを変数に格納して読み込む
ファイル内容をcatコマンドで表示させて、それを変数に格納し、ヒアドキュメントを使用して読み込む。
以下の例では、list.txtファイル内容を変数DATAに格納して、ヒアドキュメントを使用して変数の内容を読み込んでいる。
<syntaxhighlight lang="sh"> DATA=`cat ./list.txt` while read line do echo $line done << FILE $DATA FILE # 出力 one two three </source>
catコマンドでファイル内容を表示してパイプで渡す
ファイル内容をcatコマンドで表示させて、その結果をパイプを使用して読み込む。
以下の例では、lixt.txtファイルの内容をcatコマンドで表示させて、その結果をパイプでwhile readコマンドに渡している。
<syntaxhighlight lang="sh"> # 実行 cat ./list.txt | while read line do echo $line done # 出力 one two three </source>