#author("2022-11-10T12:37:40+00:00","default:admin","admin")
#author("2022-11-15T00:21:54+00:00","default:admin","admin")
-[[UNIX & Linux コマンド・シェルスクリプト リファレンス:http://www.geocities.jp/geo_sunisland/index.html]]
-[[シェル・スクリプト・リファレンス INDEX:http://itpro.nikkeibp.co.jp/article/COLUMN/20060224/230580/]]
-[[連載記事 「ステップ・バイ・ステップ・シェルスクリプト」:http://www.atmarkit.co.jp/flinux/index/indexfiles/shellsindex.html]]
-[[シェルスクリプト Tips:http://www.geocities.jp/geo_sunisland/tips.html]]
-[[シェルスクリプト 処理系コレクション:http://www.boaro.jp/linux/bash/bash_script.html]]

*全般 [#b86c7e25]
-シェルスクリプトの変数名には慣習的に大文字が使われることが多い。使い捨ての変数は小文字、それ以外は大文字を使用するという人もいる。

*基本 [#x6ef8178]
**条件分岐 [#h8377543]
-[[if 文と test コマンド:https://shellscript.sunone.me/if_and_test.html]]
-[[シェルで変数の空文字判定:https://hacknote.jp/archives/32292/]]

***文字列比較 [#ra0b617d]
-[[Bash で文字列を比較する方法:https://www.delftstack.com/ja/howto/linux/how-to-compare-strings-in-bash/]]

**例外処理 [#l63c9629]
-[[シェルスクリプトでtry-catch-finallyを実装する方法:https://webbibouroku.com/Blog/Article/shell-try-catch-finally]]
-[[シェルスクリプトで例外処理(try-catch文)のような動作を行う:https://iret.media/532]]

**JSON [#n03ac50d]
***jq [#y26371af]
-[[jq コマンドを使う日常のご紹介:https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af]]
-[[JSONデータの操作にjqコマンド使ってみたら扱いやすかったので紹介したい:https://dev.classmethod.jp/articles/json-jq-command/]]
-[[jqコマンドの基本的な利用パターン:https://zenn.dev/gekal/articles/base-use-pattern-of-jq]]
-[[jqコマンド(jsonデータの加工, 整形)の使い方:https://www.wakuwakubank.com/posts/676-linux-jq/]]

* cronで動かすときの注意点 [#t1159410]
-手動実行で動いて cron だと正常に動作しない場合は、以下の2つで解決することが多い
--コマンド実行やディレクトリ指定は絶対パスを使用する
--絶対パスが使用できない場合は cd で明示的にカレントディレクトリを移動する
-対話的コマンドは基本的に使えない
--[[expect. 対話的なコマンド(ssh, telnet, ftp, su等)を自動実行したいとき:http://www.math.kobe-u.ac.jp/~kodama/tips-expect.html]]

* デバッグ [#i91a0b98]
-[[シェルスクリプトのデバッグ:http://www.geocities.jp/geo_sunisland/debug.html]]

以下のように実行すると、実際に実行されたコマンドと変数に設定された値を確認できる。
 $ bash -x test.sh

* ファイル関連 [#td9591c4]
** ファイルの情報参照 [#b904d1a9]
 $ stat aaa
   File: `aaa'
   Size: 4               Blocks: 8          IO Block: 4096   通常ファイル
 Device: 806h/2054d      Inode: 94404618    Links: 1
 Access: (0664/-rw-rw-r--)  Uid: (  222/   adpsp)   Gid: (  222/   adpsp)
 Access: 2010-11-23 12:20:38.000000000 +0900
 Modify: 2010-11-23 12:20:25.000000000 +0900
 Change: 2010-11-23 12:20:25.000000000 +0900

** 更新日時 [#a2c6dbdd]
-シェルの比較演算
--file1 -nt file2 ... file1の更新日時がfile2の更新日時より新しければTrue
--file1 -ot file2 ... file1の更新日時がfile2の更新日時より古ければTrue

-[[指定日時よりも更新日付の新しいファイルを検索するシェルスクリプト:http://d.hatena.ne.jp/Naotsugu/20091111/1257950834]] ... オプションで古いファイルも検索できる。有用。
-[[シェルスクリプトでタイムスタンプの比較:http://blog.hansode.org/archives/50633953.html]]

* ログ圧縮 [#q6df4784]
指定ディレクトリ内の日付のディレクトリを圧縮したファイルを生成し、ディレクトリを削除(デフォルトは3日前)

 #!/bin/bash
 
 DIR=/var/aplication/log
 FROM_DATE=`date --date '3 day ago' +%Y-%m-%d`
 TO_DATE=`date --date '3 day ago' +%Y-%m-%d`
 
 while getopts 'd:f:t:' OPTION
 do
         case $OPTION in
         d)      DIR="$OPTARG"
                 ;;
         f)      FROM_DATE="$OPTARG"
                 ;;
         t)      TO_DATE="$OPTARG"
                 ;;
         ?)      printf "Usage: %s: -a aid [-d DIR] [-f FROM_DATE] [-t TO_DATE] args\n" $(basename $0) >&2
                 exit 2
                 ;;
         esac
 done
 
 target=$FROM_DATE
 target_s=`date --date "$target" '+%s'`
 to_s=`date --date "$TO_DATE" '+%s'`
 
 if [ ! -d $DIR ]; then
         echo "not found: $DIR"
         exit
 fi
 cd $DIR
 
 until [ $target_s -gt $to_s ];
 do
         echo $target
 
         if [ -d $target ]; then
                 tar cfz $target.tar.gz $target
                 STATUS=$?
                 if [ $STATUS = 0 ];then
                         rm -rf $target
                 fi
         fi
 
         target=`date --date "$target 1 day" +%Y-%m-%d`
         target_s=`date --date "$target" '+%s'`
 done

* メール送信 [#ee1c0419]
** mail コマンド使用 [#a1155cca]

** sendmail コマンド使用 [#w1764c11]

*Tips [#nc05e037]
**入力 [#cd9a7bcd]
-[[BASHシェルスクリプトで「キー入力待ち」プロンプトを実装する:https://dev.classmethod.jp/articles/waiting-for-your-input-with-read-command/]]

**日付 [#y2272bad]
-date +%Y%m%d

**文字コード変換 [#a49e6b69]
-iconv -f [変換元文字コード] -t [変換先文字コード]
--iconv -f EUCJP -t UTF8 ... EUC_JP -> UTF-8
--iconv -f EUCJP -t ISO-2022-JP ... EUC_JP -> ISO-2022-JP

**その他 [#gcf9b9eb]
-unset_linguas ... 文字コードを英語に。dateコマンド使用時など、ロケールを英語にしたいときに使用。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS