※こちらは旧サイトです(新サイトはこちら

自分用シェルスクリプトのメモ

2017-11-13 19:44:22

関数の戻り値に文字列を使う

`return`ではなく`echo`を使う

    function hoge(){
        message=${1}
        echo ${message}
    }

    output=`hoge "konnnichi world"`

    echo $output

    // 出力
    konnnichi world

if文

    str="aaa"

    # 普通のif文
    if [ ${str} = "bbb" ]; then
        echo "1:TRUE"
    else
        echo "1:FALSE"
    fi

    # not
    if [ ! ${str} = "bbb" ]; then
        echo "2:TRUE"
    else
        echo "2:FALSE"
    fi

    # 条件の連結
    if [ ! ${str} = "bbb" ] && [ ! ${str} = "ccc" ]; then
        echo "3:TRUE"
    else
        echo "3:FALSE"
    fi

    # 変数が空の状態をとる場合は"[[ ]]"で囲む ※「単項演算子が予期されます」のエラー回避

    str2=""

    if [[ ${str2} = "" ]]; then
        echo "4:TRUE"
    else
        echo "4:FALSE"
    fi

    if [[ ! ${str2} = "" ]] && [[ ! ${str2} = "" ]]; then
        echo "5:TRUE"
    else
        echo "5:FALSE"
    fi

    // 出力
    1:FALSE
    2:TRUE
    3:TRUE
    4:TRUE
    5:FALSE

デリミタで区切って部分取得(cutコマンド)

    csv="aaa,bbb,ccc"

    # cut -d [デリミタ] -f [フィールド番号]
    echo $csv | cut -d , -f 1
    echo $csv | cut -d , -f 2
    echo $csv | cut -d , -f 2-3

    // 出力
    aaa
    bbb
    bbb,ccc

デリミタで区切って配列にする(trコマンド)

    csv="aaa,bbb,ccc"

    # tr -s [from] [to]
    ary=(`echo $csv | tr -s ',' ' '`)

    for i in ${ary[@]}; do
        echo $i
    done

    // 出力
    aaa
    bbb
    ccc

特定の文字列をハイライトするfunction

    function highlight(){
        csv=${1}
        pattern=`echo $csv | tr -s ',' '|'`

        txt=`cat ${2} | perl -pe "s/(${pattern})/\e[1;31m$&\e[0m/g"`
        echo -en "${txt}"
    }

    // 使い方(highlight [カンマ区切りでハイライトキーワード] [対象ファイルのPATH])
    highlight aaa,ccc hoge.txt

    // 出力
    aaabbbcccdddeee

wget:更新があった時だけダウンロードする(-N)

$ wget -N ftp://hogehoge.com/path/to/hoge.gz
# 出力先のパス
OUTDIR=/path/to/outdir

# 返り値は「-N」の有無にかかわらず「0」なので、タイムスタンプは自前で取る
BF=`date +%y%m%d%H%M%S -r ${OUTDIR}/hoge.gz`
wget -N -P ${OUTDIR} ftp://hogehoge.com/path/to/hoge.gz
AF=`date +%y%m%d%H%M%S -r ${OUTDIR}/hoge.gz`

if [[ ${BF} < ${AF} ]]; then
    echo " ---> ダウンロード前後で変更がありました"
else
    echo " ---> ダウンロード前後で変更がありません"
fi