#author("2022-11-10T05:16:31+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/]] **例外処理 [#l63c9629] -[[シェルスクリプトでtry-catch-finallyを実装する方法:https://webbibouroku.com/Blog/Article/shell-try-catch-finally]] -[[シェルスクリプトで例外処理(try-catch文)のような動作を行う:https://iret.media/532]] * 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コマンド使用時など、ロケールを英語にしたいときに使用。