はじめに
bashを勉強する上で抑えておくと楽になる数々をメモしました。
徐々に増やしていく予定です。
基本的な構文
ファイル読み込み
source "./env.ini";
# . "./env.ini"でも動作はする
条件文
引数の判別
if [[ $# != "1" ]]; then
echo "引数を1つ渡して下さい";
fi;
フォルダ存在チェック
if [ ! -e "./tmp" ]; then
echo "tmpフォルダは存在しません";
fi;
なんちゃって三項演算子
[[ $count == "0" ]] && echo "OK" || echo "NG" ;
直前のコマンド判別
rm -rf ./tmp
# 成功時は0が返る
if [[ $? != "0"]]; then
echo "削除に失敗しました";
fi
表示
普通の表示
echo "こんにちは";
フォーマット表示
printf "%s %s \n" "1" "2";
「\」を挟むことでコマンドを改行し、見通しを良くすることができます。
printf "%s %s \n" \
"[error]" "ファイルが存在しません";
ファイル操作
文字コード変換
iconv -f cp932 -t UTF8 nzn.csv > utf8_nzn.csv;
とあるフォルダ内ファイル一覧を取得
ls ./tmp
とあるフォルダ内ファイル一覧取得を変数格納
file_list=$(ls ./tmp);
とあるフォルダ内ファイルを降順にして一覧表示
ls -tr ./tmp;
とあるフォルダ内csvファイル、更新日の絞り込みを降順にして一覧表示(lsと同じ形で)
find ./tmp -type f -mmin +5 -print0 | xargs -0 ls -tr | sed 's!^.*/!!' | grep ".*.csv";
CSVの1行目を取得&表示
arr_first_line=$(sed -n "1p" nzn.csv | tr ',' '\n');
# --以降をすべて引数とみなす
set -- $arr_first_line;
id=${1};
name=${2};
price=${3};
ファイル分、ループ
file_list=$(ls ./tmp);
for file in $file_list; do
echo $file;
done;
mysqlの実行
mysql="mysql -u $USER -h ${HOST}";
eval $mysql -e "SELECT * FROM users;";
trap
プロセスを強制終了した際などをトリガーに、後始末をさせるコマンド。
一時フォルダ内をバッチ後は全て消しておかなければいけないなどに便利。
trap "
rm -rf tmp/*;
" 0