SoftwareDesignの2017/1号の第1特集である新春bash書き初め シェル30本ノックをやった。
結果は 19/30 でまぁまぁの出来だと思う。
コマンドやbashについていろいろと新しい発見があったのでまとめておく。
各問題の自分なりの回答は GitHub においてある。
雑誌はこちら
コマンドについて
sed
awk
抽出や変換など知れば知るほどなんでもできそうなコマンド。
sed -n '/開始パターン/,/終了パターン/p'
sed 'p' | sed '1d;$d' | paste
awk '{print}{fflush()}'
while read n; do [command] $n; done
繰り返しのイディオムで頻出。xargs
とうまく使い分けよう。
openssl
暗号関連のいろんなことができるコマンド。使うことはほとんどなさそう。
crontab
コマンドというか @reboot コマンド
で起動時に1度、指定のコマンドを実行するという設定ができることを知った。
grep
grep -q .
とすると、マッチの有無で終了ステータスが変わるので処理を分岐できる。
$ (何らかの処理) | grep -q . && (出力がある場合の処理) || (出力がない場合の処理)
と出来る。
-q
は標準出力に何も出さないオプション。
paste
それぞれのファイルの行を並列に結合する。
$ paste file1 file2 file1の1行目 file2の1行目 file1の2行目 file2の2行目 ...
標準入力も扱える。
$ seq 1 10 | paste - - 1 2 3 4 5 6 7 8 9 10
file
ファイルの種類を推定してくれるコマンド。
tee
標準出力に出力しつつ、内容をファイルに保存する。
リダイレクトでは特権(sudo
)が必要なファイルは書き込めないためtee
を使うとうまくいく。
$ echo 'foo bar' | sudo tee special_file.txt
rev
反転してくれる。
$ seq 1 10 | xargs 1 2 3 4 5 6 7 8 9 10 $ seq 1 10 | xargs | rev 01 9 8 7 6 5 4 3 2 1
[
test
コマンドの別名。if [ xxxx ];
でよく使われるのでオプションを覚えたほうが良い。
set
env
set
は現在のシェル変数、 env
は環境変数のみを出力する。
bashについて
${変数}
変数へ代入する時はスペースを入れてはいけない。
変数を使う時は$
をつける。
$ n='hello world' $ echo ${n} hello world
||
&&
終了ステータス判定
直前に実行したコマンド(処理)の終了ステータス($0
)を判定するbash演算子。
$ コマンド && コマンドが成功した時の処理 || コマンドが失敗した時の処理
<<<
標準入力へ流し込む
<<<
の右側に書いた文字列や変数の値を標準入力に流し込む。
$ cat <<< 'hello world' hello world $ cat < 'hello world' bash: no such file or directory: hello world
$(( 計算式 ))
算術式展開
いろいろな計算ができる。四則演算はもちろんのこと、論理和、論理積、ビット演算も可能。
$ echo $(( 2 * 3 + 4 )) 10
$( コマンド )
コマンド置換
コマンドの実行結果を文字列として扱える。
$ for n in $( seq 1 5 ); do echo "羊が$n匹"; done 羊が1匹 羊が2匹 羊が3匹 羊が4匹 羊が5匹
:-
変数展開
難しいのでこちら。
デフォルト値への置換ができる。
--
オプションの打ち止め。
$ mkdir -- -RF
で -RF
というディレクトリが作成される。--
以降はオプションと認識されなくなる。
$(<ファイル)
コマンド置換2
コマンド置換の拡張的な機能で「ファイル」の中身に置き換えられる。
$ echo "$(<ファイル)" > foo
は$ cp ファイル foo
と同じ。
<( コマンド )
プロセス置換
コマンドの入出力をファイルとして扱うことが出来る。
$ cat < <(echo 'hello world') hello world
さいごに
各コマンドやbashの詳しい使い方や実例は雑誌を読んでくれ。