よく使うシェルコマンド
ここではコマンド、Makefile、PIONEなどの作成や実行においてよく使うシェルコマンドを簡易的にリストアップしています。
目次
コマンドの出力結果
$()を使うことにより、シェルコマンドの出力結果を変数へ代入したり、別のコマンドの引数として使用したりすることができます。
変数代入
str=$(echo "XXX") echo "$str+1"
実行結果
XXX+1
文字列strへechoの結果が保存されさらに別のコマンドに使用することができます。
別コマンドへの引き渡し
touch $(pwd)/XXX.txt
上記のように記述すれば直接利用することもできます。
演算
整数の演算
二重括弧により、整数の演算ができます。
$ echo "$((1+1))" 2
但し、整数の演算であり割り算も商として出力されることに注意して下さい。
$ echo "$((4/3))" 1
小数の演算
下記のようにbcを用いることにより、小数の演算ができます。このときscaleにより桁数を指定して下さい。
$ echo "scale=15; 4/3" | bc 1.333333333333333
あるいはawkを利用する方法もあります。(参照:#awkについて)
$ echo "4 3" | awk '{printf("%f\n", $1/$2)}' 1.333333
制御文
if文
基本形
if [ (条件) ]; then (処理); fi
ifの後、[の後、]の前には空白が必要
条件、処理が長いときは改行やタブ、空白を使用すると、読みやすいようになります。
if [ (条件1) ]; then (処理A); if [ (条件2) ]; then (処理B); fi; (処理C); fi
elif, else付き
if [ (条件1) ]; then (処理A); elif [ (条件2) ]; then (処理B); else (処理C); fi
条件
コマンド | 用途 | 例 |
---|---|---|
-e | ファイル、ディレクトリが存在するか調べる | if [ -e Input.txt ] ; then echo "Input.txt is exist." fi |
! | 条件の反転 | if [ ! -e Input.txt ] ; then echo "Input.txt is not exist." fi |
-d | ディレクトリの有無を調べる | if [ -d Input.txt ] ; then echo "Input is not directory." fi |
補足
if文における[ ]はtestコマンドの略記であることに注意しましょう。
例:下記は同じ結果となります。
$ if [ "A" == "A" ] ; then echo "same"; fi same $ if [ "A" == "B" ] ; then echo "same"; fi
$ if $(test "A" == "A") ; then echo "same"; fi same $ if $(test "A" == "B") ; then echo "same"; fi
特にbool値を取り扱うときには注意が必要で、下記のように直接記述するようにします。([ ] を付けるとどちらも通ってしまう)
$ if true ; then echo "OK"; fi OK $ if false ; then echo "OK"; fi
case文
基本形
case (変数) in (値)) (処理) ;; esac
各区切りで;;が必要であることに注意
例
case $data in 1) echo "data is 1." ;; 2) echo "data is 2." ;; *) echo "data is invaild. " ;; esac
デフォルトの処理には*を使用します。
ループ文
for文
for (i=0; i < Max; i++) タイプ
括弧()を二重にして使用することに注意しましょう。
例
for (( i=0; i<5; i++ )); do echo "$i"; done
実行結果
0 1 2 3 4
for in
#配列などを利用したリストでループを作成できます。
for (変数名) in (配列) ; do (コマンド); done
例
ARRAY=(ABC EFG HIJ) for data in ${ARRAY[@]} ; do echo "$data"; done
実行結果
ABC EFG HIJ
while文
while [ (条件) ] ; do (コマンド); done
配列
入力
(配列名)=((値1) (値2) ...)
出力
1つだけ出力するとき
${(配列名)[(番号)]}
全ての値を出力するとき
${(配列名)[@]}
要素数を出力するとき
${#(配列名)[@]}
例
コマンド
ARRAY=(123 456 789) echo "${ARRAY[2]}" echo "${ARRAY[@]}" echo "${#ARRAY[@]}"
実行結果
789 123 456 789 3
awkについて
awkコマンドは空白やタブで区切られたファイル、データの処理として非常に便利なコマンドです。
例えば、lsコマンドやwcコマンドなどで得られるリストから指定した列だけ出力することができます。
$ wc *.txt 22 22 130 1.txt 3 3 54 2.txt 25 25 184 total $ wc *.txt | awk '{print $2}' #2列目のみを出力 22 3 25 $ wc *.txt > Data.lst $ awk '{print $2}' Data.lst #ファイルの場合 22 3 25
オプション-vを使用するとawk内でもシェル変数が利用できます。
$ for (( i=1; i<4; i++ )) > do > awk -v val=$i '{print $val}' Data.lst > done 22 3 25 22 3 25 130 54 184
その他
permission deniedのとき
基本的にはsudoコマンドを前に付ければ管理者権限で実行できます。
$ sudo echo "XXXX" > data.txt
ライブラリの書き換えなどでうまくいかないときはchownで所有者を変更します。
$ sudo chown $USER data.txt
ディレクトリ以下を再帰的に変更することもできます。(複数のユーザーで使用しているときは注意が必要です)
$ sudo chown -R $USER datadirectory/
あるいはls -axlなどで権限を確認しつつ、chmodで権限の変更をします。
$ ls -axl drwxr-xr-x 2 root staff 68 11 13 10:11 workspace $ sudo chmod g+w workspace/ $ ls -axl drwxrwxr-x 2 root staff 68 11 13 10:11 workspace
動作中のプロセスを確認したいとき
ps -axlを使用すると、動作中のプロセスリストを確認することができます。
また、topを使用するとリアルタイムでの確認ができます。
実行コマンドの場所を知りたいとき
whichを使用すると、コマンド実行している場所を出力することができます。デバッグやインストール、バージョン等の切り替えのために同じファイルがいくつもあってどれで動いているか分からなくなったときに有効です。
$ which mrcInfo /Eos/bin/mrcInfo $ which ruby /Eos/util/X86MAC64/bin/ruby $ which pione /usr/local/bin/pione
pwdによる注意事項
pwdは現在のディレクトリ名を出力するコマンドですが、リンク先のディレクトリで実行するとリンクとしてのディレクトリ名となり、実体のディレクトリ名を得られません。実体のディレクトリ名を得たい場合はオプション-Pを使用します。Eosディレクトリ内では多くのリンクを使用していますので注意が必要です。
/objects$ pwd /Eos/objects /objects$ pwd -P /Eos/optional/objects
また、リンク先を出力したい場合にはreadlinkを使用します。こちらはリンクファイル名で指定して下さい。ディレクトリ名やリンク先のファイルなどでは出力されません。
/Eos$ readlink objects optional/objects