- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2022-11-10T05:16:31+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コマンド使用時など、ロケールを英語にしたいときに使用。