半永久的に未完成のページ。ちょびちょび書き足して行きます。
echoコマンドは文字通り山びこのようなコマンドです。 echoの後ろに好きな言葉を打って、エンターを押すと
$echo hogehoge hogehoge
とそっくりそのまま帰ってくる。 入力された物を、そのまま出力するような役割のコマンドである。一見、なんの使い道があるのかと 思いそうだが、このechoはC言語でいうprintf、fortranでいうwrite, printと同様の役割として 機能させることができる。その例を次に紹介しよう。
環境変数とは、「変数」であるので、何かの値が代入されることになる。 デフォルトで環境変数は既に設定されているものもある。 例えば、PATH、SHELL、UESRなどがある。 もしそのPCのユーザー名が「Tenmongakusya」なら、
echo $USER Tenmongakusya
と表示される。 また環境変数の一覧は
env
と打つとみることができる。
環境変数の設定はexportコマンドを使う。 最初に誰もが躓く(?)PATHの設定についてはまた時間のある時にまとめます。
端末上で何かコマンドを実行すると結果が同じく端末上に表示させる。 しかし、長いスクリプトやプログラムなどを走らせる際に端末にあれこれ表示されると美しくない。 下記の方法を用いると、スクリプトの実行中に端末が美しくなり、さらにデータ処理もやりやすくなったりと ご利益多数です。
例えば、
$echo "ahooo" (入力) ahooo (出力)
この出力先を指定した場合にリダイレクトコマンド
> >>
を用いる。例えば、
$echo "ahooo" > test.txt
とすると、echoで実行された結果がtest.txtに書き込まれる。つまり例えば、
$less "test.txt" ahooo
という具体に。 では、この状態で
$echo "ahooo" >> test.txt
とすると、追加で書き込みされる。つまり、
$less "test.txt" ahooo ahooo
となる。 ">"は実行結果を、以前のデータを消去して、ファイルに記録する。 ">>"は追加で書き込みである。
さて、上のechoの例はいわゆる標準出力というもので、正常にコマンドが実行された場合の 手順である。世の中には標準エラー出力というものもあり、実行したコマンドにエラーが見つかると、 エラーメッセージとして端末に表示させる。 エラーメッセージをファイルに書き込む際は、
2> 2>>
と2という数字を指定する。1は標準出力、2は標準エラー出力を表す。 実はいうと、標準出力も
1> 1>>
とやってもできる。
パイプ
|
出力と入力をつなげるコマンド。 分かりやすい例がlsとgrepの組み合わせで、lsで表示された結果からさらに特定のファイルを抽出するとき
ls | grep hoge
とするとlsで表示された中から"hoge"という文字列を持つものを抜き出して表示します。 実行すれば分かると思いますが、lsの標準出力はターミナルには表示されません。 標準出力はパイプによって、grepコマンドに代入されます。
ループのコマンドである。
for loop in `jot $nloop` (Max OS X) for loop in `seq $nloop` (Linux)
1から$nloopの値まで繰り返す。 Max OS XとLinuxではコマンドが微妙に異なるので、注意しましょう。
ファイルのエンコードを変更する。
nkf -g file: fileの文字コードを表示 nkf -e file: fileの文字コードをEUCに変換 nkf -s file: fileの文字コードをShift-JISに変換 nkf -w file: fileの文字コードをUTF-8に変換
など。
ファイルの置換を行う。
sed 's/A/B/g' filename
でfilename内のAという文字をBに置き換えます。
スクリプトに置ける条件分岐のtipsです。
基本的には下記の書き方をします。
if [ 条件 ]; then 処理 fi
もしくは、
if [ 条件 ]; then 処理1 else 処理2 fi
または、
if [ 条件 ]; then 処理1 elif [ 条件 ]; then 処理2 else 処理3 fi
です。また後で例を出しますが、スペースに位置に注意です。
条件を書く際に以下のようなオプションコマンドを指定する事で様々な条件を課すことができます。 よく使うのは、
-d: ファイルがディレクトリなら -s: ファイルのサイズがゼロ以上なら -e: ファイルが存在するなら
など。またその逆は!を付けて、
! -s: ファイルのサイズがゼロ以上でないなら
などとする。 よくある単純なエラーはスペースの有無に由来するもので、
if [ ! -s filename ]; then
が正しい。
http://shellscript.sunone.me/if_and_test.html
ファイル処理やスクリプトで大活躍のawkコマンドについてのあれこれ。
基本的には列の値を読み込む。
awk '{printf $n}' filename
ここでnは列の値。(ただしファイルは空白で区切られている場合) とても便利である。
awkはファイルの列のデータを読み取ったが、今度は特定の行のデータを読み取る。
head -n "filename"
fileの頭からn行目までを取り出しなさい。
tail -m "filename"
fileの尾からm行目までを取り出しなさい。
n行目からm行目を切り取りたい時。 head -n m ファイル | tail -n (m-n+1) ファイルの先頭からm行目までを切り取りなさい。 そして、切り取ったファイルの最後の{m-n+1}行を表示しなさい。
wc filename
でfilenameの行数、単語数、バイト数を表示させる。 それぞれ単独で表示させたかったら-c(バイト数), -w(単語数), -l(行数) のオプションをつければok。 例えば、
wc -l filename
など。
例えば、以下のようなカンマで区切られたファイルがあったとする。
0.10000E+04,0.000628,0.10812E-03 0.91116E+03,0.000690,0.13368E-03 0.83022E+03,0.000757,0.16095E-03 0.75646E+03,0.000831,0.19393E-03
そこでawkコマンドで各列のデータを取り出す。
awk -F ',' '{print $n}' filename
もしくは
awk -F ',' '{printf $n}' filename
とする。ここでprintとprintfの違いは、前者は改行を行い、後者は改行しない、という違いある。 ファイルが空白で区切られている場合は','を' 'とかえればよい。 例えば、
awk -F ',' '{print $1}' filename
を実行すると、
0.10000E+04 0.91116E+03 0.83022E+03 0.75646E+03
と表示される。
例えば、 file1
a b c
file2
1 2 3
というファイルがあったとすると、
paste -d " " file1 file2 > file
とするとfileには
a 1 b 2 c 3
というファイルが作成させる。
paste -d, file1 file2 > file
とすると
a,1 b,2 c,3
とカンマで区切る事ができる。