よりハイテクなブレース展開をしてみたいので、Bashのバージョンを4系にする!(Mac)

 

あけおめ、ことよろです!
「あけよろ」とかいうみたいですね、最近は。

 

基本情報技術者試験の勉強をしていましたら、
「ブレース展開」
とやらを初見しました。

解説を読んでみると、、、

UNIXの機能で、任意の文字列を生成するために使用されます。
たとえば、まとめてファイルやディレクトを生成するときに使われます。

とのこと。よくわからん!

「UNIX機能ってことはコマンドで試せるのでは?」と思い、ググりました。
その結果、コマンドで実際に試せるようでした!

あと、過去記事で「ブレース展開」っぽいことはしてますね。
seqを使ってワンライナー書くよ。

 

さきにまとめると、

ブレース展開 ≒ seqコマンド です。

ただし、seqコマンドでは各出力文字が改行されます。

▶︎ブレース展開

$ echo {1..4}
1 2 3 4

▶︎seqコマンド

$ seq 1 4
1
2
3
4

 

 

解説にあった、

まとめてファイルやディレクトを生成する

って、実際にやってみると、こういうことなんでしょうね。

$ touch test{1..5}      #ファイルを作成
$ ls
test1	test2	test3	test4	test5
$ rm -rf test{1..5}   #いらんので消す
$ ls

 

 

 

bashのバージョンが4系(※導入方法は下に書いてます)になると、
インクリメント数の指定もできるようになります。

echo {1..10..2}  #最小値1、最大値10、増加数2
1 3 5 7 9

seqコマンドでいうと、こんな感じですね。

$ seq 1 2 10
1
3
5
7
9

 

 

こんな感じで、理解できない用語は実際にやってみると理解深まるな〜

と改めて感じたそんな日でした。

 

[ 付録 ] Macでbashのバージョンを4系にする方法

<導入環境>
– Mac
– bash 3系

$ brew upgrade bash

$ brew info bash   #4系が導入されたことを確認します。
bash: stable 5.0.0 (bottled), HEAD
Bourne-Again SHell, a UNIX command interpreter
https://www.gnu.org/software/bash/
/usr/local/Cellar/bash/4.4.19 (146 files, 8.8MB)
  Poured from bottle on 2018-03-23 at 12:55:33
/usr/local/Cellar/bash/4.4.23 (146 files, 8.8MB)
  Poured from bottle on 2019-01-07 at 21:42:09
/usr/local/Cellar/bash/5.0.0 (150 files, 9.4MB) *
  Poured from bottle on 2019-01-08 at 21:37:06
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/bash.rb
==> Options
--HEAD
	Install HEAD version
==> Caveats
In order to use this build of bash as your login shell,
it must be added to /etc/shells.
==> Analytics
install: 10,644 (30 days), 36,411 (90 days), 188,613 (365 days)
install_on_request: 8,577 (30 days), 29,862 (90 days), 146,626 (365 days)
build_error: 0 (30 days)

$  ls /usr/local/Cellar/bash
4.4.19	4.4.23	5.0.0

 

今まで使ってたbashをバックアップ的に残しておく。

$ sudo mv /bin/bash /bin/bash_old
$ sudo mv /bin/sh /bin/sh_old
$ sudo chmod a-x /bin/bash_old /bin/sh_old

 

bashの4系にシンボリックリンクを新しく登録する。

$ sudo ln -s /usr/local/Cellar/bash/4.4.23/bin/bash /bin/bash
$ sudo ln -s /usr/local/Cellar/bash/4.4.23/bin/bash /bin/sh

 

バージョンを確認→4系になっていることを確認。

$ echo $BASH_VERSION
4.4.23(1)-release
xxxxxx:/usr/local/Cellar$ /bin/bash --version
GNU bash, バージョン 4.4.23(1)-release (x86_64-apple-darwin18.0.0)
Copyright (C) 2016 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

curlコマンドのメモ

APIを取得したくて、
curlコマンドをよく使いますが、忘れるので備忘録として書きます。

Curlコマンド

– ■GET

curl -X GET https://example.com/?mode=show

curlコマンドは、
オプション  -X  でHTTPメソッドの指定ができます。
デフォルト(指定なし)はGETらしい。

 

– ■POST

curl -X POST -d "mode=insert" https://example.com/

オプション -d でフォームの送信(-dもしくは–data)をします。

 

– ■PUT

curl -X PUT -d "mode=delete&id=1" https://example.com/

最後に。。。

オプション -v
で詳細をログ出力(-vもしくは–verbose)できます。

curl -v -X POST -d "mode=insert&said=time is money&who=unknown" "https://example.com/"

awkコマンド良き。

\ 全体コードはこちら /
https://gist.github.com/kin29/18349f0aec11df73325ab466f8621232
 

awkって「オーク」と読むみたいです。
awkって訳すと、

  • 不自然な
  • ぎこちない

とかって意味らしいですが、これには全く関係なく、

    開発者3人の名前(Aho、Weinberger、Kernighan)の頭文字から命名された。

らしいです。

 

▶︎awkコマンドとは?

テキストデータの加工や処理などができる。

 

▶︎使い方

パイプ「|」で使うことが多いです。
パイプは、出力結果をパイプ後のコマンドに渡すことができるヤーツーでしたね。

# 1が表示される
# awkコマンドによってprintが実行される
echo 1 2 | awk '{print $1}'

 

計算ができる

# 3(=1+2)が表示される 
echo 1 2 | awk '{print $1+$2}'

 

「;(セミコロン)」で複数処理できる

# 3(=1+2)が表示される 
echo 1 2 | awk '{x=$1+$2; print x}'

 

seqコマンドと組み合わせる

seq 1 10 | awk '{x=$1+100; print x}'
101
102
103
104
105
106
107
108
109
110

出力する条件を決めれる。

# 3(=1+2)が表示される 
echo 1 2 | awk '$1{print}' 

 

ファイル(dummy/awk.txt)の出力結果を加工する
dummy/awk.txt

1 2
3 4

→ awk.txtはファイルなので「|」はいらない

# awk '{print $1 * $2;}' dummy/awk.txtと同じ
$ awk '{print $1 + $2;}' < awk.txt
3
7

seqを使ってワンライナー書くよ。

ワンライナーって短い命令文なのに、いっぱい仕事してくれてスマート^^

全体コードはこちら!
https://gist.github.com/kin29/8950d25cab8bd877efff88764515cf66

 

▶︎シェル変数

x=3
echo $x  #echo xではない。

出力結果

3

 

 

# コマンドを変数に入れたい時は「`」で囲む
d=`date`
echo $d

出力結果

2018年 1月 5日 金曜日 22時42分54秒 JST

 

▶︎seqコマンド

# 初期値1,間隔1(デフォルト),最大値10

$ seq 1 10
1
2
3
4
5
6
7
8
9
10

 

# 初期値1,間隔2,最大値5

$ seq 1 2 5
1
3
5

 

▶︎ forループ

$ for a in 1 2 3; do echo $a; done
1
2
3

$a に 1 を代入 → echo $a(=1)
$a に 2 を代入 → echo $a(=2)
$a に 3 を代入 → echo $a(=3)

↑と同じ結果となる

# seq 1 3は文字じゃなくてコマンドなので「`」で囲む
for b in `seq 1 3`; do echo $b; done

 

 

もっといろんなコマンド知りたい!!!
次はawkコマンドとかを探求したいと思います。

標準入出力、リダイレクト、パイプ

実家からお歳暮でもらったであろうビールをかっさらってきて、

帰宅と同時に飲むのが至福のひとときな今日この頃。

 

 

全体はこんな感じです。

 

▶︎標準入出力とは。

lsやcatなどの実行結果は、
指定しない限り、普通は画面に表示される。←これです!
デフォルトではそれぞれ以下のようになっている。
標準入力 → キーボード
標準出力 → 画面

こんな感じ

# キーボードで入力(標準入力)したものがそのままに出力(標準出力)される
echo hello!

 

▶︎リダイレクトとは。

「リダイレクト」を使うと、標準入出力を指定のファイルに変更することができる。

出力リダイレクト

画面(標準出力)でなく、ファイルに結果を出力する

# 「hello!」という出力結果を新規ファイルoutput.txtに出力
echo hello! > output.txt

#「>」は上書き
# dateコマンドの出力結果を既存ファイルoutput.txtに上書き
date > output.txt

#「>>」は追記
# 「add!」という出力結果を既存ファイルoutput.txtに追記
echo add! >> output.txt

入力リダイレクト

キーボード(標準入力)でなく、ファイルからの入力をコマンドに渡す

# cat output.txtと同じ結果
# cat 0< output.txtと同じ結果
cat < output.txt

echo 6+1 > input.txt
# bc 0< input.txtと同じ結果
bc < input.txt

 

▶︎パイプ「|」とは。

標準出力をコマンドに渡す

# 中間ファイルが不要となる 
# echo 6+1 > input.txt && bc < input.txt と同じ結果
echo 6+1 | bc

 

#余談

過去のコミット全部自分のものにしたい時

$ git filter-branch -f --env-filter "GIT_AUTHOR_NAME='名前';\
 GIT_AUTHOR_EMAIL='メールアドレス';\
 GIT_COMMITTER_NAME='名前';\
 GIT_COMMITTER_EMAIL='メールアドレス';" \
HEAD

過去のコミットを編集することは歴史をガラリとかえて未来に影響が大きいのであまりしないほうがいいです、はい。
けど今回グローバルネームでコミットしてしまっていたため変更しました。もちろん

$ git config --local user.name 名前
$ git config --local user.email "メールアドレス"

もしましたよ。