「よく使うシェルコマンド」の版間の差分

提供: Eospedia
移動: 案内検索
(その他)
(条件)
 
(同じ利用者による、間の15版が非表示)
行1: 行1:
 
 ここでは[[コマンド]]、[[Makefile]]、[[PIONE]]などの作成や実行においてよく使うシェルコマンドを簡易的にリストアップしています。
 
 ここでは[[コマンド]]、[[Makefile]]、[[PIONE]]などの作成や実行においてよく使うシェルコマンドを簡易的にリストアップしています。
 +
 +
== コマンドの出力結果 ==
 +
$()を使うことにより、シェルコマンドの出力結果を変数へ代入したり、別のコマンドの引数として使用したりすることができます。<br>
 +
<br>
 +
 +
変数代入<br>
 +
<pre>
 +
str=$(echo "XXX")
 +
echo "$str+1"
 +
</pre>
 +
<br>
 +
 +
実行結果<br>
 +
<pre>
 +
XXX+1
 +
</pre>
 +
文字列strへechoの結果が保存されさらに別のコマンドに使用することができます。<br>
 +
<br>
 +
 +
別コマンドへの引き渡し<br>
 +
<pre>
 +
touch $(pwd)/XXX.txt
 +
</pre>
 +
上記のように記述すれば直接利用することもできます。<br>
 +
<br>
 +
 +
== 演算 ==
 +
=== 整数の演算 ===
 +
二重括弧により、整数の演算ができます。<br>
 +
<pre>
 +
$ echo "$((1+1))"
 +
2
 +
</pre>
 +
<br>
 +
 +
但し、整数の演算であり割り算も商として出力されることに注意して下さい。<br>
 +
<pre>
 +
$ echo "$((4/3))"
 +
1
 +
</pre>
 +
<br>
 +
 +
=== 小数の演算 ===
 +
下記のようにbcを用いることにより、小数の演算ができます。このときscaleにより桁数を指定して下さい。<br>
 +
<pre>
 +
$ echo "scale=15; 4/3" | bc
 +
1.333333333333333
 +
</pre>
 +
<br>
 +
 +
あるいはawkを利用する方法もあります。(参照:[[#awkについて]])<br>
 +
<pre>
 +
$ echo "4 3" | awk '{printf("%f\n", $1/$2)}'
 +
1.333333
 +
</pre>
 +
<br>
  
 
== 制御文 ==
 
== 制御文 ==
行10: 行66:
 
<br>
 
<br>
  
条件、処理が長いときは\を使うと行をまたぐことができ、読みやすいようになります。<br>
+
条件、処理が長いときは改行やタブ、空白を使用すると、読みやすいようになります。<br>
 
<pre>
 
<pre>
if [ (条件1) ]; then \
+
if [ (条件1) ]; then
(処理A); \
+
(処理A);
if [ (条件2) ]; then \
+
if [ (条件2) ]; then
(処理B); \
+
(処理B);
fi; \
+
fi;
(処理C); \
+
(処理C);
 
fi
 
fi
 
</pre>
 
</pre>
行24: 行80:
 
elif, else付き
 
elif, else付き
 
<pre>
 
<pre>
if [ (条件1) ]; then \
+
if [ (条件1) ]; then
(処理A); \
+
(処理A);
elif [ (条件2) ]; then \
+
elif [ (条件2) ]; then
(処理B); \
+
(処理B);
else \
+
else
(処理C); \
+
(処理C);
 
fi
 
fi
 
</pre>
 
</pre>
 
<br>
 
<br>
  
==== 条件 ====
+
==== 条件(一部) ====
 
<table border="1">  
 
<table border="1">  
 
<tr>
 
<tr>
行43: 行99:
 
<tr>
 
<tr>
 
<td>-e</td>
 
<td>-e</td>
<td>ファイル、ディレクトリが空か調べる</td>
+
<td>ファイル、ディレクトリが存在するか調べる</td>
<td>if [ -e Input.txt ] ; then echo "Input.txt is not empty!"  fi</td>
+
<td>if [ -e Input.txt ] ; then echo "Input.txt is exist."; fi</td>
 
</tr>
 
</tr>
 
<tr>
 
<tr>
 
<td>!</td>
 
<td>!</td>
 
<td>条件の反転</td>
 
<td>条件の反転</td>
<td>if [ ! -e Input.txt ] ; then echo "Input.txt is empty!"  fi</td>
+
<td>if [ ! -e Input.txt ] ; then echo "Input.txt is not exist."; fi</td>
 
</tr>
 
</tr>
 
<tr>
 
<tr>
 
<td>-d</td>
 
<td>-d</td>
 
<td>ディレクトリの有無を調べる</td>
 
<td>ディレクトリの有無を調べる</td>
<td>if [ -d Input.txt ] ; then echo "Input is not directory!"  fi</td>
+
<td>if [ -d Input.txt ] ; then echo "Input is not directory.";  fi</td>
 +
</tr>
 +
<tr>
 +
<td>-z</td>
 +
<td>文字列が空かを調べる</td>
 +
<td>if [ -z $data ] ; then echo " data is empty."; fi</td>
 
</tr>
 
</tr>
 
</table>
 
</table>
 +
<br>
 +
 +
==== 補足 ====
 +
if文における[ ]はtestコマンドの略記であることに注意しましょう。<br>
 +
例:下記は同じ結果となります。<br>
 +
<pre>
 +
$ if [ "A" == "A" ] ; then echo "same"; fi
 +
same
 +
$ if [ "A" == "B" ] ; then echo "same"; fi
 +
 +
</pre>
 +
<pre>
 +
$ if $(test "A" == "A") ; then echo "same"; fi
 +
same
 +
$ if $(test "A" == "B") ; then echo "same"; fi
 +
 +
</pre>
 +
<br>
 +
 +
特にbool値を取り扱うときには注意が必要で、下記のように直接記述するようにします。([ ] を付けるとどちらも通ってしまう)<br>
 +
<pre>
 +
$ if true ; then echo "OK"; fi
 +
OK
 +
$ if false ; then echo "OK"; fi
 +
 +
</pre>
 +
<br>
 +
 +
=== case文 ===
 +
基本形<br>
 +
<pre>
 +
case (変数) in (値)) (処理) ;; esac
 +
</pre>
 +
各区切りで;;が必要であることに注意<br>
 +
<br>
 +
 +
例<br>
 +
<pre>
 +
case $data in
 +
1)
 +
echo "data is 1."
 +
;;
 +
2)
 +
echo "data is 2."
 +
;;
 +
*)
 +
echo "data is invaild. "
 +
;;
 +
esac
 +
</pre>
 +
デフォルトの処理には*を使用します。<br>
 
<br>
 
<br>
  
行66: 行178:
 
例<br>
 
例<br>
 
<pre>
 
<pre>
for (( i=0; i<5; i++ )); \
+
for (( i=0; i<5; i++ ));
do \
+
do
echo "$i"; \
+
echo "$i";
done \
+
done
 
</pre>
 
</pre>
 
<br>
 
<br>
行94: 行206:
 
ARRAY=(ABC EFG HIJ)
 
ARRAY=(ABC EFG HIJ)
  
for data in ${ARRAY[@]} ; \
+
for data in ${ARRAY[@]} ;
do \
+
do
echo "$data"; \
+
echo "$data";
 
done
 
done
 
</pre>
 
</pre>
行111: 行223:
 
=== while文 ===
 
=== while文 ===
 
<pre>
 
<pre>
while [ (条件) ] ; \
+
while [ (条件) ] ;
do \
+
do
(コマンド); \
+
(コマンド);
 
done  
 
done  
 
</pre>
 
</pre>
行159: 行271:
 
123 456 789
 
123 456 789
 
3
 
3
 +
</pre>
 +
<br>
 +
 +
== awkについて ==
 +
[[awk]]コマンドは空白やタブで区切られたファイル、データの処理として非常に便利なコマンドです。<br>
 +
<br>
 +
 +
例えば、lsコマンドやwcコマンドなどで得られるリストから指定した列だけ出力することができます。<br>
 +
<pre>
 +
$ 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
 +
</pre>
 +
<br>
 +
 +
オプション-vを使用するとawk内でもシェル変数が利用できます。
 +
<pre>
 +
$ 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
 
</pre>
 
</pre>
 
<br>
 
<br>
行194: 行346:
 
ps -axlを使用すると、動作中のプロセスリストを確認することができます。<br>
 
ps -axlを使用すると、動作中のプロセスリストを確認することができます。<br>
 
また、topを使用するとリアルタイムでの確認ができます。<br>
 
また、topを使用するとリアルタイムでの確認ができます。<br>
 +
<br>
 +
 +
=== 実行コマンドの場所を知りたいとき ===
 +
whichを使用すると、コマンド実行している場所を出力することができます。デバッグやインストール、バージョン等の切り替えのために同じファイルがいくつもあってどれで動いているか分からなくなったときに有効です。<br>
 +
<pre>
 +
$ which mrcInfo
 +
/Eos/bin/mrcInfo
 +
$ which ruby
 +
/Eos/util/X86MAC64/bin/ruby
 +
$ which pione
 +
/usr/local/bin/pione
 +
</pre>
 +
<br>
 +
 +
=== pwdによる注意事項 ===
 +
pwdは現在のディレクトリ名を出力するコマンドですが、リンク先のディレクトリで実行するとリンクとしてのディレクトリ名となり、実体のディレクトリ名を得られません。実体のディレクトリ名を得たい場合はオプション-Pを使用します。Eosディレクトリ内では多くのリンクを使用していますので注意が必要です。<br>
 +
<pre>
 +
/objects$ pwd
 +
/Eos/objects
 +
/objects$ pwd -P
 +
/Eos/optional/objects
 +
</pre>
 +
<br>
 +
 +
また、リンク先を出力したい場合にはreadlinkを使用します。こちらはリンクファイル名で指定して下さい。ディレクトリ名やリンク先のファイルなどでは出力されません。<br>
 +
<pre>
 +
/Eos$ readlink objects
 +
optional/objects
 +
</pre>
 
<br>
 
<br>

2015年3月31日 (火) 02:20時点における最新版

 ここではコマンドMakefilePIONEなどの作成や実行においてよく使うシェルコマンドを簡易的にリストアップしています。

コマンドの出力結果

$()を使うことにより、シェルコマンドの出力結果を変数へ代入したり、別のコマンドの引数として使用したりすることができます。

変数代入

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
-z 文字列が空かを調べる if [ -z $data ] ; then echo " data is empty."; 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