2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

シェルスクリプト覚え書き

Last updated at Posted at 2020-08-02

今日の日付を取得

書式指定ができる(以下の場合は8桁)

date '+%Y%m%d' # 8桁
date '+%Y-%m-%d %H%M%S' # 時刻まで含む

ディレクトリの名前を取得

今いるディレクトリの名前のみが必要な場合は、

current_dir=`pwd -P | rev | cut -f 1 -d / | rev`

pathを取得して、その中にリスト中のディレクトリ名が含まれているかどうか判断する (何も考えずにディレクトリ構造を作ってしまったが、変更が面倒なときに有用)。

explist=(mh lgm)
if [[ $(printf '%s\n' "${explist[@]}" | grep -qx "${exp}"; echo -n ${?} ) -eq 0 ]]; then
	workdir=./past/${exp} 
    else
	workdir=./${exp}
fi

lsで例外処理

特定の条件を除外してlsしたい場合

ls --ignore={"*.nc", "*.csv"}

拡張子が.nc.csvのファイルが取り除かれる。

forループでループする数字の桁を揃える

3桁に揃えたい場合。

sample.sh
for i in `seq -f %03g 1 100`
do
        hogehoge
done

複数行のecho

いちいちテキストファイルに出力しなくてもいいんです。

sample.sh
{
      echo 0 1
      echo 0 4
}

とすると

0 1
0 4

と出力。

オプションを定義

スクリプト実行時にオプションをつけたい場合は、コマンドラインで

bash sample.gmt -I [filename] -O

スクリプト中では、

sample.gmt
CMDNAME=`basename $0`
while getopts I:O OPT # オプションに引数が必要な場合は":"をつける
do
     case ${OPT} in 
     # 該当するものがあるか、上から順にチェック
     "I"  ) FLAG_I="TRUE"     ; filename=${OPTARG}          ;;
     "O"  ) FLAG_O="TRUE"                                    ;; 
     *    ) echo "Usage: ${CMDNAME} [-I filename] " ; exit ;;
     # 該当するものがなかった場合、終了
     esac
done

ループ内変数をループ外で使う

以下のようにしてしまうと、ループでの計算結果が反映されない

sample_error.sh
i=0
cat ${file} | while read dummy num
do
      if [ $num -lt 0 ] ; then
            i=$((i+num))
      fi
done
echo $i

パイプをやめるとうまくいった

sample_correct.sh
i=0
for num in `awk '{print $2}' ${file}`
do
      if [ $num -lt 0 ] ; then
            i=$((i+num))
      fi
done
echo $i

小数演算

exprコマンドなどでは、整数演算ができるが、小数演算ができない。そこで、

echo "3.5+1.2" | bc

とすれば、

4.7

と返ってくる!桁数を指定したい場合は、

echo "scale=3;10.0/3.0" | bc

とすれば、小数点以下3桁で計算されて、

3.333

if文の条件判定

演算子 意味
-eq equal
-ne not equal
-lt less than
-le less than or equal
-gt greater than
-ge greater than or equal
-e check existance
-d check directory
-f check file
-n not empty

if文で小数の大小判定をしたい

直接if文のなかで処理できないので、工夫が必要

sample.sh
result=`echo "$x >= $y" | bc` ; echo ${result}
if [ ${result} -eq 1 ]; then
       echo "$x >= $y"
       hogehoge
else
       echo "$x < $y"
       piyopiyo
fi

行番号をつけて出力

sample.sh
nl -w $num ${filename} > ${outfile} #numは桁数

画像サイズを変更 (convert)

画像サイズを変えたいとき、

convert ${infile} -resize ${width}x${height} ${outfile}

タテヨコ比を無視したいときは、!をつければよい

convert ${infile} -resize ${width}x${height}! ${outfile}

白背景の透過

convert original.png -fuzz 10% -transparent white transparent.png

参考

画像の結合

convert -append figure1.png figure2.png figure3.png output.png #縦
convert +append figure1.png figure2.png figure3.png output.png #横
montage -tile [横]x[縦] -geometry 100% *.png output.png # 縦横

参考

アニメーション作成

-delayでタイムステップを指定(1/100秒単位)。画像ファイルは数字で名前振っておくと楽。

 convert -delay 30 *.png output.gif

sedによる行の取り扱い

filenameの8行目を削除

sed -i '8d' ${filename}

filenameの1行目にTEXT labelを追加(スペースがある場合は、"で囲む)

cat ${filename} | sed -e "1iTEXT label" > ${outfile}

awkによる列の取り扱い

filenameの1列目が2だったときに2列目の値を返す

awk '{if($1==2){print $2}}' ${filename}

filenameの1列目がstrだったときに2列目の値を返す

awk -v a="${str}" '{if($1==a){print $2}}' ${filename}

filenameの1列目が2だったときにn列目の値を返す

loopの中などでつかう

awk -v n=${loopno} '{if($1==2){print $n}}' ${filename}

返した値を他の変数に読ませたいときは、

result=`awk '{if($1==2){print $2}}' ${filename}`

filenameの2行目までをoutfileへ出力

awk 'NR<=2' ${filename} > ${outfile}

filenameの2行目から5行目をoutfileへ出力

awk 'NR==2,NR==5' ${filename} > ${outfile}

filenameの末尾の行だけをとりだす

awk '{print $NF}' ${filename} > ${outfile}

出力結果の桁を指定

awk '{printf "書式\n", $NF}' ${filename} > ${outfile}

プロセスIDをまとめてkillしたい

list=($(ps -f |awk '{{print $2}}'))
echo ${list[@]}

問題なさそうだったら、kill ${list[@]}

例外ファイルを指定してまとめて削除したい

RSTASYSIN以外のファイルやディレクトリを削除するには、

ls | grep -v "RSTA\|SYSIN" | xargs rm -r

書式制御文字一覧

演算子 意味
%d 十進整数、%iも使用可
%e 指数形式、%Eの場合Eが大文字で出力される
%f 小数点を使用した形式、桁数は%4.3fのように指定する
%g %f%eで短くなる方、%Gの場合%E同様Eを大文字で出力
%o 符合なしの八進数
%x 符合なしの十六進数、'%X'の場合アルファベットを大文字時で出力
%c ASCIIキャラクタ、例えば'65'をいう数値を'A'と出力
%s 文字列

関連ページ

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?