😇

TIL: UNIXプログラミング環境 第3章 後半

に公開1

UNIXプログラミング環境 第3章 後半

内容はToday I Learnedということで、学びを記す記事です。
 詳しいわけではないので悪しからず。

後半なので唐突に感じると思います、前半も合わせてぜひ

書籍はこちら
UNIXプログラミング環境

3.5プログラム出力を引数として与える方法

逆引用符 `` コマンドの引数に渡している文字列をコマンドとして認識させることができる。

$ echo At the tone the time will be `date`
At the tone the time will be (dateの実行結果)

ちなみにMacで行うと、

$ echo At the tone the time will be `date`
At the tone the time will be #午後

となりました。
原因がわからず、、、

以下も同様の結果

$ echo "At the tone the
time will be `date`"
At the tone the
time will be #午後

3.6 シェル変数

シェルにも変数はあり、方言でパラメータと呼ばれることがある。
setコマンドで変数一覧が見れる
とんでもない量の変数が出てきました。

$ set
変数一覧

変数を設定するには、
文字列=入れたい値
で変数を使用する場合は、
$変数

$ x="Good Bye"
$ echo $x
Good Bye

ただこれは定義したシェルの中でのみ使用可能な変数となっている。
そのため、子シェルを作った場合は変数を利用できない

$ x="Good Bye"
$ sh       新しいシェルへ
$ echo $x
何も表示されない
$

子シェルへも変数として伝えたい場合は、exportコマンドを使用する

$ x="Hello World"
$ export x
$ sh
$ echo $x
Hello World

3.7 さらに高度な入出力の切換え

全てのプログラムは実行時に3つのファイルが暗黙のうちに設定される。(今も変わってないのかな)
ファイル指定子も設定されており、1つ目が標準入力(0)、2つ目が標準出力(1)、3つ目が標準エラー出力(2)である。

プログラムによっては、正しく動作してもこの標準エラーへ出力されるものがある。

> >> << < のような演算子で入出力を切り替えられる話が載っていました。
上記のファイル指定子と組み合わせると、n>filenameで標準出力などをファイルに書き出すことができる。

$ wc junk 1>test
$ cat test
 4       8      37 junk

3.8 シェル・プログラムにおけるループ

シェルにも処理を繰り返し行うループが存在する。
 基本的な構文はpythonと一緒。

$ for i in *
for> do
for>    echo $i
for> done

これを実行するとファイル名が列挙される。*はシェルが動いているディレクトリ内のファイルを操作するものであるとわかる。
 また、echoの後ろが$iになっているように、3.6節で学んだシェル変数になっていることがわかる。
冒頭でi=(ファイル名)を繰り返しているとわかる。

またfor文の中のコマンド群の出力は以下のように、標準入力として渡せる。
for文全体の結果がfor文の標準出力になる!

$ for i in *
> do
> echo $i
> done | pr -h 

一般的な数値をいくつか使いたい場合は

$ for i in 2 3 4 5
> do
>   echo $i
> done
2
3
4
5

ただfor文は代替できるもっと優秀なものが多いので、あまり使わないとのこと。
例えば

$ for i in *
> do
> echo $i
> done | pr -h 

lsで済むし、全ファイルをchmodしたいとかの場合でも
$ chmod +x $*
の方が優秀であるため。

まとめ

かなり本格的な応用方法が記されていて、正直どこに使うのかわからないものも多くありました。

  • 変数が定義できる
  • forで繰り返せる
  • ただし代替手段が豊富

業務中などに、「こういう処理ができるシェルスクリプトがあったらな」と感じた時に再び読んで、やっと見になる内容だと思いました。
そういう機会があればぜひ記事にしていきます。

Discussion