ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

SoftwareDesign6月号「bash再入門」でbash復習

はじめに

基本的にSoftwareDesignは特集で買うかどうかを決めます。なぜかというと連載モノは連続で買わないと読めないんですよね。というか最初から読まないといけない、に近い。1つで完結した内容になってないんですよね。まぁそれはさておき。

今回の特集は「bash再入門」と「MySQLを武器にSQLをはじめよう」の2つ。

bashを使わずに仕事をすることはできません。基本的な内容はあるとしても、何か1つでも得ることはあるだろうと思い、これを機に復習することにしました。

MySQLのほうもMariaDBいれたりガレラクラスタ組んだりして、SQLもしもしする練習もしたいんですが、今回は見送り。

bashとは何か?

第1章 bashとは何か〜古くて新しいシェル環境 より

bashって何ですか?というのを知ったのは実は最近だったりする。。。シェルはユーザインターフェイスのことと言ってもいいだろう。ユーザとUNIXカーネルの橋渡しをする存在。そのシェルの中でもbashcshzshと様々な種類のソフトウェアがある。ほとんどのLinuxディストリビューションにおいてbashが標準であるため、bashは最低限押さえておく必要がある。

同期氏はzsh推しだから使ってみたい気もするけど、まずは標準からですね。

今使っているシェルを確認する

第2章 最初につまづかないためのbashひとめぐりより

普段自分が今何のシェルを使っているかを意識したことがないので、おそらくbashだったのでしょうが、確認しておきましょう。

インストールされているシェル

/etc/shellsを確認してみます。

MacBook-Air:~ take$ cat -n /etc/shells 
     1 # List of acceptable shells for chpass(1).
     2 # Ftpd will not allow users to connect who are not using
     3 # one of these shells.
     4 
     5 /bin/bash
     6 /bin/csh
     7 /bin/ksh
     8 /bin/sh
     9 /bin/tcsh
    10 /bin/zsh

ログインシェル

$SHELLに入っているようです。

MacBook-Air:~ take$ echo $SHELL
/bin/bash

シェルを変更する

chshで変更します。

MacBook-Air:~ take$ chsh -s /bin/zsh
Changing shell for take.
Password for take: 
MacBook-Air:~ take$ 

ログインシェルは通常/etc/passwdに書かれてあるらしいですが、Macの場合別の場所で管理されてるそう。

システム環境設定→ユーザとグループから。

f:id:take_she12:20160605203112p:plain

f:id:take_she12:20160605203117p:plain

ちゃんとログインシェル変わってますね。

シェルのショートカットキー

Ctrl-aで行頭、Ctrl-eで行末へ移動知らなかった。。。カーソル連打で戻ってたよ。。。

その他単語レベルでの移動やカットも便利そう。

history(コマンド実行履歴)の利用

たまに過去のコマンド探すのにhistoryをgrepしたりはしますが、これ、Ctrl-rで検索できるじゃん。。知らなかったよ。。。

(reverse-i-search)`grep': grep take /etc/passwd

(Ctrl-rを押すと(reverse-i-search)と表示され、文字を入力すると候補が出る。続けてCtrl-rを押せば上にあがっていく。

シェルスクリプトの復習

第4章 シェル芸問題で腕を磨け!テキスト処理・計算・調査の定石 より

シェル芸!何でもワンライナーで書く必要はないですが、その能力は必ず役に立ちますよね。この章で出てくるコマンドについて復習します。

tr

ファイル内の文字を一括変換する、と言われてもイマイチピンとこない。

Linuxコマンド集 - 【 tr 】 文字を一括変換する:ITpro

オプションなし

MacBook-Air:bash take$ cat test.txt 
hogepogehogepoge
hogepogehogepoge
hogepogehogepoge

MacBook-Air:bash take$ cat test.txt | tr hoge HOGE
HOGEpOGEHOGEpOGE
HOGEpOGEHOGEpOGE
HOGEpOGEHOGEpOGE

これ、単語レベルじゃなくて、hはHに、oはOにgはGに、eはEに変換されるんですね。

-cオプション

MacBook-Air:bash take$ cat test.txt | tr -c ge GE
EEgeEEgeEEgeEEgeEEEgeEEgeEEgeEEgeEEEgeEEgeEEgeEEgeEEMacBook-Air:bash take$ 

ごめんどういう挙動か全然わかんない。。。

manを見てみる。

     -C      Complement the set of characters in string1, that is ``-C ab''
             includes every character except for `a' and `b'.

     -c      Same as -C but complement the set of values in string1.

String1で指定した文字以外の文字を、String2で指定した文字列に置換するのか。

MacBook-Air:bash take$ cat test2.txt 
1234
5678
90
MacBook-Air:bash take$ cat test2.txt | tr -c 159 a
1aaaa5aaaa9aa

1,5,9以外の文字が全てaに置換されてますね。ちなみにString2をabとすると全部bに変わっちゃいます。最後の文字を対象にしているのかな。補集合を変換したいときに使うんですね。で、改行文字も変換されちゃってるってわけか。

-dオプション

これは削除なのでわかりやすい。

MacBook-Air:bash take$ cat test2.txt 
1234
5678
90
MacBook-Air:bash take$ cat test2.txt | tr -d 159
234
678
0

-tオプション

String1をString2の長さに切り詰めるって何を言ってるかわかんないので使ってみます。

MacBook-Air:bash take$ cat test2.txt | tr -t 123 123
tr: illegal option -- t
usage: tr [-Ccsu] string1 string2
       tr [-Ccu] -d string1
       tr [-Ccu] -s string1
       tr [-Ccu] -ds string1 string2

おこられる。確かにmanに載ってない。なんだこれ。

-sオプション

連続文字を1文字にする

MacBook-Air:bash take$ cat test3.txt 
hogeeeeeeeeee
pogeeeeeee
togee
MacBook-Air:bash take$ cat test3.txt | tr -s e
hoge
poge
toge

分かりやすいね。

xargs

xargs コマンド | コマンドの使い方(Linux) | hydroculのメモ

ファイル名の一覧を標準入力から受け取って、そのファイル一覧を任意のコマンドに引数として渡すコマンド。ファイル一覧でなくてもなんでもよい。

日本語で頼む。

findもしくはls、またはファイル一覧を入力として、それを1つずつ次のコマンドに渡してやるって感じかな。

MacBook-Air:bash take$ ls
test.txt    test2.txt   test3.txt
MacBook-Air:bash take$ ls | xargs cat
hogepogehogepoge
hogepogehogepoge
hogepogehogepoge

1234
5678
90
hogeeeeeeeeee
pogeeeeeee
togee

なるほど。覚えておいたら使いドコロがありそうだ。

bc

数値計算を行う。

やってみる。

MacBook-Air:bash take$ echo 1+3 | bc
4

なるほど、前の式を渡してやれば計算してくれるのか。

おわりに

実は下書きのまま残っていたものを投稿しました。このあとfishの特集があり、これを読んだ時にfishをいれて今も使っているのですが、使いこなせてないので、機能調べがてら、fishの記事を書こうと思います。