「シェルスクリプトの基礎 - 外部コマンド」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
編集の要約なし
編集の要約なし
10行目: 10行目:
<br>
<br>
そのまま実行すると<コマンド名のフルパスが出力されるので、/dev/nullデバイスへリダイレクトして、出力を抑制している。<br>
そのまま実行すると<コマンド名のフルパスが出力されるので、/dev/nullデバイスへリダイレクトして、出力を抑制している。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  if type -P python > /dev/null; then
  if type -P python > /dev/null; then
     echo "python コマンドを使用できます"
     echo "python コマンドを使用できます"
16行目: 16行目:
     echo "python コマンドが見つかりません"
     echo "python コマンドが見つかりません"
  fi
  fi
  </source>
  </syntaxhighlight>
<br>
<br>
また、指定した外部コマンドが使用できない場合、シェルスクリプトを終了させるには、以下のように記述すればよい。<br>
また、指定した外部コマンドが使用できない場合、シェルスクリプトを終了させるには、以下のように記述すればよい。<br>
22行目: 22行目:
<br>
<br>
また、<code>echo</code>の出力を<code>>&2</code>とリダイレクトすると、標準エラー出力へ出力できる。<br>
また、<code>echo</code>の出力を<code>>&2</code>とリダイレクトすると、標準エラー出力へ出力できる。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  if ! type -P python3 > /dev/null; then
  if ! type -P python3 > /dev/null; then
     echo 'This script requires Python 3. Please install Python 3 first and try again.' >&2
     echo 'This script requires Python 3. Please install Python 3 first and try again.' >&2
     exit -1
     exit -1
  fi
  fi
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


37行目: 37行目:
<br>
<br>
以下の例では、lsコマンドの実行結果を変数FILESに代入して、echoで出力している。<br>
以下の例では、lsコマンドの実行結果を変数FILESに代入して、echoで出力している。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/sh
  #!/bin/sh
   
   
  FILES=$(ls)
  FILES=$(ls)
  echo "$FILES"
  echo "$FILES"
  </source>
  </syntaxhighlight>
または<br>
または<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/sh
  #!/bin/sh
   
   
  FILES=`ls`
  FILES=`ls`
  echo "$FILES"
  echo "$FILES"
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


56行目: 56行目:
<br>
<br>
以下の例では、カレントディレクトリ下の.shファイルを再帰的に列挙している。<br>
以下の例では、カレントディレクトリ下の.shファイルを再帰的に列挙している。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  find . -name '*.sh' | while read SHFILE; do
  find . -name '*.sh' | while read SHFILE; do
     echo "$SHFILE"
     echo "$SHFILE"
  done
  done
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


68行目: 68行目:
forループのinの後の変数(以下の例では、変数SHFILES)には、スペース区切りで各要素が列挙される。<br>
forループのinの後の変数(以下の例では、変数SHFILES)には、スペース区切りで各要素が列挙される。<br>
変数SHFILESの値にスペースが含まれる場合、行を1つの要素として処理するためには、変数をダブルクォーテーションで囲む必要がある。<br>
変数SHFILESの値にスペースが含まれる場合、行を1つの要素として処理するためには、変数をダブルクォーテーションで囲む必要がある。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  SHFILES=$(find . -name '*.sh')
  SHFILES=$(find . -name '*.sh')
   
   
74行目: 74行目:
     echo "$SHFILE"
     echo "$SHFILE"
  done
  done
  </source>
  </syntaxhighlight>
<br><br>
 
== 日時 ==
<code>date</code>コマンドを使用すると、現在時刻を表す文字列を自由なフォーマットで取得することができる。<br>
例えば、時刻入りの簡単なログを出力する場合やバックアップを作成する時のファイル名の構成のために使用する。<br>
<br>
以下の例では、<code>date</code>コマンドを使用して、日付からYYYYMMDD-HHMMSSのような文字列を作成している。<br>
date +%Y%m%d-%H%M%S
20200101-083015
<br>
以下の例では、現在日時をファイル名に付加してファイルのコピー(バックアップ)を行っている。<br>
cp Sample.txt Sample_`date +%Y%m%d`.txt
# 出力
ls
Sample.txt
Sample_20050102.txt
<br><br>
<br><br>


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

2020年11月28日 (土) 03:21時点における版

概要

シェルスクリプトにおいて、外部コマンドを使用する必要がある場合、その外部コマンドが使用可否を調べておくと便利である。


外部コマンドの使用可否

以下の例では、pythonコマンドの使用可否を確認している。

type -P <コマンド名>は、環境パスで指定されたディレクトリから<コマンド名>を検索して、そのフルパスを取得するが、
ここでは、<コマンド名>の使用可否を確認するために利用している。

そのまま実行すると<コマンド名のフルパスが出力されるので、/dev/nullデバイスへリダイレクトして、出力を抑制している。

 if type -P python > /dev/null; then
    echo "python コマンドを使用できます"
 else
    echo "python コマンドが見つかりません"
 fi


また、指定した外部コマンドが使用できない場合、シェルスクリプトを終了させるには、以下のように記述すればよい。
条件式を!で反転させていることに注意すること。

また、echoの出力を>&2とリダイレクトすると、標準エラー出力へ出力できる。

 if ! type -P python3 > /dev/null; then
    echo 'This script requires Python 3. Please install Python 3 first and try again.' >&2
    exit -1
 fi



外部コマンドの出力と変数

lsgrepfind等のコマンドの実行結果を変数に代入するには、以下のように記述する。

変数=$(コマンド)
または
変数=`コマンド`


以下の例では、lsコマンドの実行結果を変数FILESに代入して、echoで出力している。

 #!/bin/sh
 
 FILES=$(ls)
 echo "$FILES"

または

 #!/bin/sh
 
 FILES=`ls`
 echo "$FILES"



パイプとwhile readコマンド

find . -name '*.sh'等の外部コマンドの出力結果を1行ずつ処理するには、パイプwhile readコマンドに接続して記述する。

以下の例では、カレントディレクトリ下の.shファイルを再帰的に列挙している。

 find . -name '*.sh' | while read SHFILE; do
    echo "$SHFILE"
 done



外部コマンドの出力と配列

パイプを使用せず、`コマンド名`または$(コマンド名)で実行した外部コマンドの出力を、配列で受け取る方法もある。

forループのinの後の変数(以下の例では、変数SHFILES)には、スペース区切りで各要素が列挙される。
変数SHFILESの値にスペースが含まれる場合、行を1つの要素として処理するためには、変数をダブルクォーテーションで囲む必要がある。

 SHFILES=$(find . -name '*.sh')
 
 for SHFILE in "$SHFILES"; do
    echo "$SHFILE"
 done



日時

dateコマンドを使用すると、現在時刻を表す文字列を自由なフォーマットで取得することができる。
例えば、時刻入りの簡単なログを出力する場合やバックアップを作成する時のファイル名の構成のために使用する。

以下の例では、dateコマンドを使用して、日付からYYYYMMDD-HHMMSSのような文字列を作成している。

date +%Y%m%d-%H%M%S

20200101-083015


以下の例では、現在日時をファイル名に付加してファイルのコピー(バックアップ)を行っている。

cp Sample.txt Sample_`date +%Y%m%d`.txt

# 出力
ls
Sample.txt
Sample_20050102.txt