bashスクリプトに関するメモ

bashスクリプトに関するメモ。最近知ったものや、以前から知っていたものなど。

空のファイルを生成する

他にも方法はあるが。

: > file

グループコマンド

{}で複数のコマンドをグループ化できる。

{
  echo 1
  echo 2
  echo 3
}

出力がまとめられるのでファイルに出力する場合は高速化が期待できる。

: > file
echo 1 >> file
echo 2 >> file
echo 3 >> file
{
  echo 1
  echo 2
  echo 3
} > file

forwhileなども同様。

$ for i in {0..9}
> do
>   echo -n $i
> done > file
$ cat file
0123456789

ヒアドキュメントでのインデント

<<-として先頭行にタブ文字を置くとタブ文字が無視されるのでインデントできる。

cat <<-EOB > file
    #!/bin/bash
    ls -l
EOB

ヒアドキュメントで変数などを展開しない

区切り文字列を'で囲む。

$ cat <<'EOB'
> $(ls)
> EOB
$(ls)

ヒアストリング

<<<で文字列を直接標準入力に渡せる。

$ grep -o cde <<<abcdefg
cde
$ str='abcdefg'
$ grep -o cde <<<$str
cde

プロセス置換

>()<()でコマンドの出力をファイルとして扱うことができる。前者は使ったことがない。

$ diff -u <(printf '%s\n%s\n' 1 2) <(printf '%s\n%s\n' 1 3)
--- /dev/fd/63  2014-12-01 01:56:08.000000000 +0900
+++ /dev/fd/62  2014-12-01 01:56:08.000000000 +0900
@@ -1,2 +1,2 @@
 1
-2
+3

bashのプロセス置換機能を活用して、シェル作業やスクリプト書きを効率化するがとても参考になる。

現在実行中のシェルのバージョンを表示する

C-x C-vと入力する。

$
GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin14)

現在実行中のセッションのバージョンを表示するので、古いバージョンのシェルで起動してアップデートしたあとそのままセッションを残した状態でバージョンを確認するとバージョンが異なる場合がある。

$
GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin14)
$ bash --version
GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin14)
Copyright (C) 2007 Free Software Foundation, Inc.

bashはとても奥が深くて、調べるたびに新しいことを知ることが多い。