1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

shellプログラミングの書き方と実行、デバック方法

Posted at

業務で覚えた知識を備忘録として記載していきます。

対象者

  • 初めてshellスクリプトを書く人
  • shellの実行方法とか忘れた人

shellスクリプトの書き方と実行方法について、少し間が空くとすぐに忘れてしまうので備忘録として作成。shellの基本的な書き方と実行方法について記載していきます。

やりたいこと

  • ゼロベースでshellスクリプトを作り実行する。
  • 実行時にエラーが出た場合はエラー個所を把握して修正できるようになる。

作業環境

Ubuntu VERSION="20.04.1 LTS (Focal Fossa)"
Windows環境でも簡単にLinuxコマンドが練習出来て便利ですね。

絶対に必要な記述

sample.sh
#!/bin/bash

冒頭にこの記述は絶対に必要となります。
絶対に必要な割にコピペして作る機会が増えるとスペルミスが増えるので間違えずに!

先ほどの宣言の後は基本的に何を書いてもOKです。
Linuxのコマンドを打って実行できることは何でも実行可能になります。(多分)

sample.sh
#!/bin/bash

echo "処理開始"
# echoで文字出力したりとか
date +'%Y%m%d'
# Linuxのコマンド結果は動作可能です。

ちなみに「#」で囲っている文字はshellの中では処理対象として認識されません。
これから実行するプログラムの説明概要を書いたり、一時的に記述した内容を無効にしたい場合などに利用します。
行いたい処理を記載したら名前を付けて保存します。
この時、拡張子はなくてもよいのですが、慣習的に「.sh」が使われる事がほとんどのようです。

実行、デバック方法

「.sh」でファイル保存したら次は実行方法についてです。
実行する場所はどこでもいいです。自分が今いる階層にファイルがなくても、実行時にパスを書いてあげれば動かすことは可能です。
実行方法は1つではありませんが、私がよくやるやり方は「sh -x sample.sh」といったやり方です。この実行方法だと、shellの中で定義した変数が確認できたりと色々と便利です。特に処理が複雑になってくるとどこのミスがあるのか見つけるのも大変なので実行結果が返ってくるよりも良いです。

sample.sh
#!/bin/bash
TODAY=`date +'%Y%m%d'`
echo "処理開始"
$TODAY

shell実行

$user sh -x sample.sh

実行結果

+ date +%Y%m%d
+ TODAY=20210125
+ echo 処理開始
処理開始
+ 20210125
sample.sh: 4: 20210125: not found
+ exit

「+」以下の内容は通常の実行では見れない情報です。今回の処理では4行目の処理で異常があることがわかります。
こうした以上は実行結果の戻り値を拾ってもみることが出来ます。
コマンド実行した後に「$?」と打つと、実行したコマンドの戻り値が見れます。「0」以外は異常終了したことを示します。
逆に言えば「0」が出てれば正常に終了したことを意味します。
これを利用して処理の結果にif判定で「0」が返ってきたかを見て正常かどうかを判断することが出来ます。

sample.sh
#!/bin/bash
TODAY=`date +'%Y%m%d'`
echo "処理開始"
$TODAY
if [ $? -ne 0 ];then
 echo "$TODAYは異常終了しました"
 exit 1
fi
echo $TODAY
exit

shell実行

$user sh -x sample.sh

実行結果

+ date +%Y%m%d
+ TODAY=20210125
処理開始
+ 20210125
sample.sh: 4: 20210125: not found
+ [ 127 -ne 0 ]
+ echo 20210125は異常終了しました
20210125は異常終了しました
+ exit 1

戻り値が「0」ではないので異常終了していることがわかりました。
ちなみにこの処理では4行目で「$TODAY」と記載していることが原因です。
$TODAYをecho $TODAYと直すと以下となります。

sample.sh
#!/bin/bash
TODAY=`date +'%Y%m%d'`
echo "処理開始"
echo $TODAY
if [ $? -ne 0 ];then
 echo "$TODAYは異常終了しました"
 exit 1
fi
exit
+ date +%Y%m%d
+ TODAY=20210125
+ echo 処理開始
処理開始
+ echo 20210125
20210125
+ [ 0 -ne 0 ]
+ exit

どこが悪いのかがわかりやすいですね。
どこにでもあるのに、少し見ないとすぐ忘れてしまうshellの書き方と実行方法についてでした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?