🌊

シェルスクリプト

に公開

1.bashの文字列

<'>と<">の区切り文字で定義できる

foo=bar
echo "$foo">
barと出力する
foo=bar
echo '$foo'
$fooと出力

2.bashはif,case,while,forなどの制御構造の使用が可能

以下はディレクトリを作りcdでその中に移動するものである

 mcd(){
  mkdir -p "$1"
  cd "$1"
  }
  • ここで$1はこのスクリプトへ渡される一番目の引数である
  • 以下にbashを使用し指定した引数、エラーコードや他の変数のリストを示す
    • $0 スクリプト名
    • $1から$9 スクリプトに渡される引数
    • $@ 全ての引数
    • $# 引数の総数
    • $? 直前のコマンドのリターンコード
    • $$ 現在のスクリプトのプロセス識別子(PID)
    • !! 引数を含む直前のコマンド全体
    • $_ 直前のコマンドの最後の引数

3.終了ステータス

終了ステータスはコマンドを条件付きで実行するためにも使われる
その際に&&と||の2つの短絡評価演算子を用いる

  • ;を用いてコマンドの同じ行内を分割することも可能
  • tureプログラムは常に0のリターンコードを返す
  • falseプログラムは常に0のリターンコードを返す

4.コマンド代入

for file in $(ls)と実行するとシェルはまずlsを呼び出し、次にそれらの値について繰り返し処理する

5.プロセス代入

diff <(ls too) <(ls bar)と実行するとディレクトリはfoobarの中にあるファイルの違いを示す。

6.シェル関数とスクリプトの違い

  • 関数はシェルと同じ言語ではなければならない。一方スクリプトはどの言語でも可。
  • 関数は一度定義が読み込まれればロードされる。一方スクリプトは実行するたびに定義を再読み込みしなければならない。
  • 関数は現在のシェル環境で実行されるのに対し、スクリプトは自身のプロセスの中で実行される。故に関数は環境変数を変更することが可能である。
  • どのプログラミング言語とも同様に関数はシェルコードのモジュール性、再利用性、可読性を高めるのに強力な構造である。

7.ファイル検索

findを使用することでファイルを検索することが可能である

  • find . -name src -type d
    • srcという名前の全てのディレクトリを検索
  • find . -path '*/test/*.py' -type f
    • パスにtestという名前のフォルダがある全てのpythonファイルを検索
  • find . -mtime -1
    • 1日前に変更された全てのファイルを検索
  • find . -size +500k -size -10M -name '*.tar.gz'
    • サイズが500kから10Mの間のいある全てのzipファイルを検索
  • find . -name '*.tmp' -exec rm {} \;
    • .tmp拡張子のファイルを全て削除する
  • find . -name '*.png' -exec convert {} {}.jpg \;
    • 全てのPNGファイルを検索し、JPGに変更する

8.コードの検索

ファイルの内容を検索したい場合にrgを使用する。

  • rg -t py 'import requests'
    • requestsライブラリを使用した全てのpythonファイルを検索
  • rg -u --files-without-match "^#!"
    • シェバン行がない全てのファイル(隠しファイルを含む)を検索
  • rg foo -A 5
    • 全てのfooを検索し、その後の5行を出力
  • rg --stats PATTERN
    • 一致した集計を出力

Discussion