パスの末尾に/があるかないかを気にしたくない
文字列を結合してパスを生成したりするときに、パスを格納した複数の変数を文字列結合するときがあります。
dirHome="/var/lib/hoge/"
workDirName="work"
echo "${dirHome}${workDirName}" # /var/lib/hoge/workと表示される
しかし、dirHomeやworkDirNameのような変数をコンフィグファイルで設定していたり、実際に参照するところと定義箇所が遠いときがあると厄介なことが起こりえます。
例えば、下記のようにdirHomeの末尾に/がなかったらどうなりますでしょうか?
dirHome="/var/lib/hoge"
workDirName="work"
echo "${dirHome}${workDirName}" #/var/lib/hogeworkと表示されてしまう
これを防ぐ方法があります。
${dirHome%/}/${workDirName}
%Xはその前の変数に含まれる文字列を末尾からXを検索して最も近くでヒットしたXを削除します。
そのため、${dirHome}の末尾に/があるかないかを問わず、常に/を末尾に追記することができます。
ちなみに、最も最後にヒットしたXを削除する%%Xも存在します。
プロセスの検索にはpgrepを使う
pgrepが使える環境であれば、それを使うようにしましょう。
pgrep hogeと記述すれば、下記のようなコマンドを打つ必要がなくなります。
ps -ef | grep -v grep | grep hoge
文字列はクォートで囲うようにする
変数の定義の仕方は3通りあります。
var=HOGE
var='HOGE'
var="HOGE"
格納する文字列にスペースが入っていたり、エディタのシンタックスハイライトのことを考えると、クォートで囲うようにしたほうが良いでしょう。
ファイル名に実行した日付を入れたい
ls -la > _result_`date +"%Y%m%d-%H%M%S"`.txt
フォーマットの記述が覚えづらいかもしれませんが、「月と日以外は大文字」でフォ−マットの指定の仕方を覚えると良いでしょう。
数値計算には$(())を使うようにする
数値計算の記述の方法が2種類あります。
ans=$((1 + 1))
ans=`expr 1 + 1`
しかしながら、$(())を使うようにしたほうがよいでしょう。
exprは掛け算と割り算に関してエスケープが必要であったり直感的でありません。
ans=`expr 2 \* 1`
ans=`expr 2 \/ 1`
検索したファイル名とファイル名称とファイルサイズを獲得したい
find . -ls -print | awk '{ print $11 " " $7}'
findコマンドに-lsをつけるとls -lをしたときのようにファイルのメタ情報が見られるようになるのですが、それらは列表示されています。そしてそれらをawkコマンドに渡すことで$11のようにしてカラム番号を指定してカラムを獲得することができます。
ファイルサイズを物理サイズで獲得したい
duコマンドはブロックサイズでサイズを計算します。
そのためduコマンドでは物理サイズを獲得することができません。
find -lsコマンドを使用します。
find . -ls | awk '{ print $11 " " $7}'
# ./hogehoge.txt 430620 と表示される
なお、ディレクトリサイズはコピーしたときに減ることがあります。
これはディレクトリにファイルを格納していくとディレクトリのブロックサイズも増えていくのですが、その後にファイルを削除してもブロックサイズは縮小されないためです。
Linux という事なので find コマンドは GNU find だと思いますが、
-printfというオプションがあります。とすると、パス(
%p)とサイズ(%s)を表示します。こちらも Linux の場合は GNU coreutils の du コマンドだと思いますので、
-bオプションを指定することで物理サイズが表示されます。-b, --bytes equivalent to '--apparent-size --block-size=1'@heliac2000
こういう便利なオプションもあったんですね!
情報ありがとうございます!