「シェルスクリプトの基礎 - ファイルとディレクトリ」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の4版が非表示)
7行目: 7行目:
if文の演算子で、-eを使用することでファイルが存在することを確認することができる。<br>
if文の演算子で、-eを使用することでファイルが存在することを確認することができる。<br>
以下のシェルスクリプトでは、test.txtファイルが存在するか確認して、ファイルが存在する場合、File exists.と表示する。<br>
以下のシェルスクリプトでは、test.txtファイルが存在するか確認して、ファイルが存在する場合、File exists.と表示する。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
15行目: 15行目:
     echo "File exists."
     echo "File exists."
  fi
  fi
  </source>
  </syntaxhighlight>
<br>
<br>
===== ファイルが存在しない場合 =====
===== ファイルが存在しない場合 =====
21行目: 21行目:
つまり、! -eと記述することで、ファイルが存在しない場合に真となる。<br>
つまり、! -eと記述することで、ファイルが存在しない場合に真となる。<br>
以下のシェルスクリプトでは、test.txtファイルが存在しない場合に、File not exists.と表示する。<br>
以下のシェルスクリプトでは、test.txtファイルが存在しない場合に、File not exists.と表示する。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
30行目: 30行目:
     exit -1
     exit -1
  fi
  fi
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


37行目: 37行目:
if文の演算子で、-dを使用することでディレクトリが存在することを確認することができる。<br>
if文の演算子で、-dを使用することでディレクトリが存在することを確認することができる。<br>
以下のシェルスクリプトでは、testディレクトリが存在する場合、Directory exists.と表示する。<br>
以下のシェルスクリプトでは、testディレクトリが存在する場合、Directory exists.と表示する。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
45行目: 45行目:
     echo "Directory exists."
     echo "Directory exists."
  fi
  fi
  </source>
  </syntaxhighlight>
<br>
<br>
===== ディレクトリが存在しない場合 =====
===== ディレクトリが存在しない場合 =====
51行目: 51行目:
つまり、! -dと記述することで、ディレクトリが存在しない場合に真となる。<br>
つまり、! -dと記述することで、ディレクトリが存在しない場合に真となる。<br>
以下のシェルスクリプトでは、testディレクトリが存在しない場合に、Directory not exists.と表示する。<br>
以下のシェルスクリプトでは、testディレクトリが存在しない場合に、Directory not exists.と表示する。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
60行目: 60行目:
     exit -1
     exit -1
  fi
  fi
  </source>
  </syntaxhighlight>
<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
</syntaxhighlight>
<br><br>
<br><br>


116行目: 129行目:
== ファイルの処理 ==
== ファイルの処理 ==
==== ワイルドカードの使用 ====
==== ワイルドカードの使用 ====
ワイルドカード(*)を使用して、カレントディレクトリ内のファイルを順に処理することができる。
ワイルドカード(*)を使用して、カレントディレクトリ内のファイルを順に処理することができる。<br>
以下の例では、全てのファイルを繰り返し処理している。
以下の例では、全てのファイルを繰り返し処理している。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  for FILENAME in *; do
  for FILENAME in *; do
     echo "$FILENAME"
     echo "$FILENAME"
  done
  done
  </source>
  </syntaxhighlight>
<br>
<br>
特定の拡張子を持つファイルのみを列挙する場合は、以下のように記述する。
特定の拡張子を持つファイルのみを列挙する場合は、以下のように記述する。<br>
以下の例では、全てのPNGファイルを繰り返し処理している。
以下の例では、全てのPNGファイルを繰り返し処理している。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  for PNGFILE in *.png; do
  for PNGFILE in *.png; do
     echo "$PNGFILE"
     echo "$PNGFILE"
  done
  done
  </source>
  </syntaxhighlight>
<br>
<br>
また、次のように1行で記述することもできる。
また、次のように1行で記述することもできる。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  for PNGFILE in *.png; do echo "$PNGFILE"; done
  for PNGFILE in *.png; do echo "$PNGFILE"; done
  </source>
  </syntaxhighlight>
<br>
ワイルドカードを使用する場合、アスタリスク(*)をクォートの中に入れると、シェルによるワイルドカードの展開が行われない。<br>
<br>
<br>
<syntaxhighlight lang="sh">
# 推奨する記述
## パス部分は安全にクォートされて、アスタリスクはワイルドカードとして機能する
rm -r "$HOME/.cache/"*
# 間違った記述
## アスタリスクがクォート内にあるため、*は文字列として扱われてワイルドカードとして機能しない
rm -r "$HOME/.cache/*"
## パスにスペースが含まれている場合、パスが正しく解釈されない
## また、変数が未定義の場合、意図しない動作につながる可能性がある
rm -r $HOME/.cache/*
</syntaxhighlight>
<br>
==== findコマンドの結果の使用(再帰処理) ====
==== findコマンドの結果の使用(再帰処理) ====
以下の例では、findコマンドで検索したファイルを、while文で順に処理している。
以下の例では、findコマンドで検索したファイルを、while文で順に処理している。
深い階層にあるファイルも再帰的に処理される。
深い階層にあるファイルも再帰的に処理される。
  <source lang="sh">
  <syntaxhighlight lang="sh">
  find . -type f | while read FILENAME; do
  find . -type f | while read FILENAME; do
     echo "$FILENAME"
     echo "$FILENAME"
  done
  done
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


158行目: 188行目:
==== テキストファイルを1行のみ読み込む ====
==== テキストファイルを1行のみ読み込む ====
readコマンドは、ユーザからの入力の他に、ファイルからの入力を1行のみ読み込むことができる。<br>
readコマンドは、ユーザからの入力の他に、ファイルからの入力を1行のみ読み込むことができる。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  read line < list.txt
  read line < list.txt
165行目: 195行目:
  # 出力
  # 出力
  AAA  100
  AAA  100
  </source>
  </syntaxhighlight>
<br>
<br>
==== 標準入力へリダイレクトさせて読み込む ====
==== 標準入力へリダイレクトさせて読み込む ====
ファイルを標準入力へリダイレクトさせて、ファイル内容を1行ずつ読み込ませる。<br>
ファイルを標準入力へリダイレクトさせて、ファイル内容を1行ずつ読み込ませる。<br>
以下の例では、list.txtファイルの内容を読み込み、1行ずつechoコマンドで表示させている。<br>
以下の例では、list.txtファイルの内容を読み込み、1行ずつechoコマンドで表示させている。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  while read line
  while read line
181行目: 211行目:
  two
  two
  three
  three
  </source>
  </syntaxhighlight>
<br>
<br>
==== ファイルを変数に格納して読み込む ====
==== ファイルを変数に格納して読み込む ====
ファイル内容をcatコマンドで表示させて、それを変数に格納し、ヒアドキュメントを使用して読み込む。<br>
ファイル内容をcatコマンドで表示させて、それを変数に格納し、ヒアドキュメントを使用して読み込む。<br>
以下の例では、list.txtファイル内容を変数DATAに格納して、ヒアドキュメントを使用して変数の内容を読み込んでいる。<br>
以下の例では、list.txtファイル内容を変数DATAに格納して、ヒアドキュメントを使用して変数の内容を読み込んでいる。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  DATA=`cat ./list.txt`
  DATA=`cat ./list.txt`
  while read line
  while read line
199行目: 229行目:
  two
  two
  three
  three
  </source>
  </syntaxhighlight>
<br>
<br>
==== catコマンドでファイル内容を表示してパイプで渡す ====
==== catコマンドでファイル内容を表示してパイプで渡す ====
ファイル内容をcatコマンドで表示させて、その結果をパイプを使用して読み込む。<br>
ファイル内容をcatコマンドで表示させて、その結果をパイプを使用して読み込む。<br>
以下の例では、lixt.txtファイルの内容をcatコマンドで表示させて、その結果をパイプでwhile readコマンドに渡している。<br>
以下の例では、lixt.txtファイルの内容をcatコマンドで表示させて、その結果をパイプでwhile readコマンドに渡している。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  cat ./list.txt | while read line
  cat ./list.txt | while read line
215行目: 245行目:
  two
  two
  three
  three
  </source>
  </syntaxhighlight>
<br><br>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:シェルスクリプト]]
[[カテゴリ:シェルスクリプト]]