Bashシェルスクリプトの忘れがちな書き方

日付形式の文字列を使用する。

#!/bin/bash
# "2023-05-15 12:31:22" を表示
test1=$(date +"%Y-%m-%d %H:%M:%S")
echo $test1
# "20230505" を表示
test2=$(date --date "-10 days" +"%Y%m%d")
echo $test2

コマンドの成功と失敗を判定する。

#!/bin/bash
directoryLocation="/tmp/directory/"
mkdir $directoryLocation
if [ ! $? -eq 0 ]; then
    echo "ディレクトリの作成に失敗しました。"
fi

ファイルやディレクトリの存在を確認する。

#!/bin/bash
directoryLocation="/tmp/directory/"
if [ ! -d "$directoryLocation" ]; then
    echo "ディレクトリは存在しません。"
fi
fileLocation="${directoryLocation}test.txt"
if [ ! -f "$fileLocation" ]; then
    echo "ファイルは存在しません。"
fi
anyItemLocation="/tmp/any-item"
if [ -e "$anyItemLocation" ]; then
    echo "何かが存在します。"
fi

よくcronで数秒ごとに処理したい場合に使用する。非同期での実行になる。

#!/bin/bash
for i in `seq 0 5 59`; do 
    (
        sleep $i
        echo "$i Running"
    ) &
done;

こちらもcronで多用する。実行時のコマンドライン引数も含めたプロセスを確認して、実行中のプロセスがなければ新しいプロセスを起動するような場合に使用する。
※xオプションは制御ttyを持たないプロセスを表示
※aオプションはttyを持つすべてのプロセスを表示

#!/bin/bash
sec="123"
test=$(ps xa 2>/dev/null | grep $sec 2>/dev/null)
if [[ ! $test = *"top -d $sec"* ]]; then
    top -d $sec
fi

起動コマンドに部分一致したプロセスをkillしたい場合に使用する。
※プロセス名が”next-server (v14.2.8)”だった場合の例
※-oオプションは表示項目を指定

#!/bin/bash
process=$(ps xa -o pid,command | grep next | grep server);
for pid in $process
do
    kill $pid
    break
done

特定のリッスンポートに一致するプロセスをkillしたい場合に使用する。
※-lオプションはリッスン状態のソケットだけを表示
※-nオプションはサービス名ではなくポート番号を表示
※-pオプションはプロセスの情報を表示

#!/bin/bash
port=3000
processes=$(ss -lnp | grep $port)
processes=(${processes//,/ })
for part in ${processes[@]}
do
    if [[ $part == "pid="* ]]; then
        pid=$(echo $part | sed "s/pid=//g")
        kill $pid
        break
    fi
done