「シェルスクリプトの基礎 - 外部コマンド」の版間の差分
編集の要約なし |
編集の要約なし |
||
10行目: | 10行目: | ||
<br> | <br> | ||
そのまま実行すると<コマンド名のフルパスが出力されるので、/dev/nullデバイスへリダイレクトして、出力を抑制している。<br> | そのまま実行すると<コマンド名のフルパスが出力されるので、/dev/nullデバイスへリダイレクトして、出力を抑制している。<br> | ||
< | <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 | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
また、指定した外部コマンドが使用できない場合、シェルスクリプトを終了させるには、以下のように記述すればよい。<br> | また、指定した外部コマンドが使用できない場合、シェルスクリプトを終了させるには、以下のように記述すればよい。<br> | ||
22行目: | 22行目: | ||
<br> | <br> | ||
また、<code>echo</code>の出力を<code>>&2</code>とリダイレクトすると、標準エラー出力へ出力できる。<br> | また、<code>echo</code>の出力を<code>>&2</code>とリダイレクトすると、標準エラー出力へ出力できる。<br> | ||
< | <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 | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
37行目: | 37行目: | ||
<br> | <br> | ||
以下の例では、lsコマンドの実行結果を変数FILESに代入して、echoで出力している。<br> | 以下の例では、lsコマンドの実行結果を変数FILESに代入して、echoで出力している。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/sh | #!/bin/sh | ||
FILES=$(ls) | FILES=$(ls) | ||
echo "$FILES" | echo "$FILES" | ||
</ | </syntaxhighlight> | ||
または<br> | または<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/sh | #!/bin/sh | ||
FILES=`ls` | FILES=`ls` | ||
echo "$FILES" | echo "$FILES" | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
56行目: | 56行目: | ||
<br> | <br> | ||
以下の例では、カレントディレクトリ下の.shファイルを再帰的に列挙している。<br> | 以下の例では、カレントディレクトリ下の.shファイルを再帰的に列挙している。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
find . -name '*.sh' | while read SHFILE; do | find . -name '*.sh' | while read SHFILE; do | ||
echo "$SHFILE" | echo "$SHFILE" | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
68行目: | 68行目: | ||
forループのinの後の変数(以下の例では、変数SHFILES)には、スペース区切りで各要素が列挙される。<br> | forループのinの後の変数(以下の例では、変数SHFILES)には、スペース区切りで各要素が列挙される。<br> | ||
変数SHFILESの値にスペースが含まれる場合、行を1つの要素として処理するためには、変数をダブルクォーテーションで囲む必要がある。<br> | 変数SHFILESの値にスペースが含まれる場合、行を1つの要素として処理するためには、変数をダブルクォーテーションで囲む必要がある。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
SHFILES=$(find . -name '*.sh') | SHFILES=$(find . -name '*.sh') | ||
74行目: | 74行目: | ||
echo "$SHFILE" | echo "$SHFILE" | ||
done | done | ||
</ | </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
外部コマンドの出力と変数
ls
、grep
、find
等のコマンドの実行結果を変数に代入するには、以下のように記述する。
変数=$(コマンド) または 変数=`コマンド`
以下の例では、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