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

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
編集の要約なし
編集の要約なし
12行目: 12行目:
  <source lang="sh">
  <source lang="sh">
  if type -P python > /dev/null; then
  if type -P python > /dev/null; then
     echo 'python コマンドを使用できます'
     echo "python コマンドを使用できます"
  else
  else
     echo 'python コマンドが見つかりません'
     echo "python コマンドが見つかりません"
  fi
  fi
  </source>
  </source>
21行目: 21行目:
条件式を<code>!</code>で反転させていることに注意すること。<br>
条件式を<code>!</code>で反転させていることに注意すること。<br>
<br>
<br>
また、<cod>echo</code>の出力を<code>>&2</code>とリダイレクトすると、標準エラー出力へ出力できる。<br>
また、<code>echo</code>の出力を<code>>&2</code>とリダイレクトすると、標準エラー出力へ出力できる。<br>
  <source lang="sh">
  <source lang="sh">
  if ! type -P python3 > /dev/null; then
  if ! type -P python3 > /dev/null; then
30行目: 30行目:
<br><br>
<br><br>


== コマンドの実行結果を変数に代入する ==
== 外部コマンドの出力と変数 ==
<code>ls</code>、<code>grep</code>、<code>find</code>等のコマンドの実行結果を変数に代入するには、以下のように記述する。<br>
<code>ls</code>、<code>grep</code>、<code>find</code>等のコマンドの実行結果を変数に代入するには、以下のように記述する。<br>
  変数=$(コマンド)
  変数=$(コマンド)
    または
または
  変数=`コマンド`
  変数=`コマンド`
<br>
<br>
49行目: 49行目:
  FILES=`ls`
  FILES=`ls`
  echo "$FILES"
  echo "$FILES"
</source>
<br><br>
== パイプとwhile readコマンド ==
<code>find . -name '*.sh'</code>等の外部コマンドの出力結果を1行ずつ処理するには、<code>パイプ</code>で<code>while read</code>コマンドに接続して記述する。<br>
<br>
以下の例では、カレントディレクトリ下の.shファイルを再帰的に列挙している。<br>
<source lang="sh">
find . -name '*.sh' | while read SHFILE; do
    echo "$SHFILE"
done
</source>
<br><br>
== 外部コマンドの出力と配列 ==
パイプを使用せず、<code>`コマンド名`</code>または<code>$(コマンド名)</code>で実行した外部コマンドの出力を、配列で受け取る方法もある。<br>
<br>
forループのinの後の変数(以下の例では、変数SHFILES)には、スペース区切りで各要素が列挙される。<br>
変数SHFILESの値にスペースが含まれる場合、行を1つの要素として処理するためには、変数をダブルクォーテーションで囲む必要がある。<br>
<source lang="sh">
SHFILES=$(find . -name '*.sh')
for SHFILE in "$SHFILES"; do
    echo "$SHFILE"
done
  </source>
  </source>
<br><br>
<br><br>

2020年10月7日 (水) 20:29時点における版

概要

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


外部コマンドの使用可否

以下の例では、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