初心者のWEBデザイン

HTML,CSS、その他WEBデザインに関する事を記述していきます。

bash ShellScript いつも調べていること一覧 健忘録

ShellScriptルーチンワークを自動化する際に書くのですが
毎日触れていないしたまにしか書かないので
これなんだっけ?・これどういう風に書くんだっけ?を連発します。

なので、健忘録でまとめておきます。

  1. ShellScriptの絶対パスの取得
  2. コマンドの結果を変数に代入する
  3. 関数の宣言方法
  4. 配列宣言の方法
  5. 配列をforでループさせたい
  6. 配列の要素数を取得する
  7. インクリメント・ディクリメントする
  8. デリミタの確認方法
1 ShellScriptの絶対パスの取得

ShellScriptを実行する際に、そのファイルを実行する絶対パスを取得したいことが
多々あるかと思います。
そんな時に記述するコードが下記になります。


dirnameは、第一引数に指定したパス名の一つ上のディレクトリまでの絶対パスを返します。
ファイル名までを指定した場合には、ファイル名を除いた絶対パスを返します。
$0は第一引数の取得です。実行しているShellScriptが、$0に代入されます。

コマンドの流れとしては

今回の場合はドキュメントルートにtest.shがあると想定します。

#!/bin/bash

SCRIPT_DIR=$(cd $(dirname $0); pwd)
echo $SCRIPT_DIR # 出力結果 /Users/ユーザー名
2コマンドの結果を変数に代入する

ShellSciprtを書いているとfind・grepなどの結果を変数に代入したいことがあります。
結果を代入したいコマンドを$(コマンド)にします。
今回はルートディクレトリにcat.txtがあった場合

#!/bin/bash

files=$(find . -name "cat.txt")
echo ${files}  
#出力結果/Users/ユーザー名/cat.txt
3 関数の宣言方法
#!/bin/bash
#関数の宣言 functionは省略可能
function callHelloWorld() {
  echo "Hello World"
}
#関数の呼び出し 他の一般的な言語と違って()は必要なし
callHelloWorld
#出力結果  Hello World
4 配列の宣言方法

bashの配列宣言は
配列名と=(イコール)と代入したい内容にスペースは他の一般的な言語と違って
NGになります。エラーは出ないけど代入できません。
また要素と要素の間は【,】(カンマ)ではなくスペースになります。

#!/bin/bash

animals=("cat" "dog" "bird")
5 配列をforでループさせたい

配列を全てループさせたい時には配列名に[@]を付け足します。
また配列の要素にスペースが入っている場合はスペースで要素を分けて
認識してしまうので、配列名を""(ダブルクォーテーション)で囲ってあげます。

例えば配列の要素に"Java Script"があった場合
"Java"と"Script"の様に分けられてしまいます。

#!/bin/bash

program=("C Lang" "java" "Python" "PHP" "Java Script" "Ruby")
for name in "${program[@]}"; do # ←← 配列名を""(ダブルクォーテーション)
  echo $name
done
#出力結果
#c Lang
#java
#Python
#PHP
#Java Script
6 配列の要素数を取得する
#!/bin/bash

animals=(Cat Dog Bird [4]=Lion [6]=Elephant )
# 配列の要素数を調べる
echo 配列の要素数は${#animals[@]}
7 インクリメント・ディクリメントする

何個か書き方があります。

cnt=0

while [ $cnt -lt 10 ]; do
    # 何かの処理
    cnt=$(( cnt + 1 )) # cnt をインクリメント
    echo $cnt
done
cnt=0
while [ $cnt -lt 10 ]; do
    # 何かの処理
    (( cnt ++ )) # cnt をインクリメント
    echo $cnt
done

実行速度はexprは遅い

cnt=0
while [ $cnt -lt 10 ]; do
    # 何かの処理
    cnt=`expr $cnt + 1` # cnt をインクリメント
    echo $cnt
done
デリミタの確認方法

デリミタの環境変数【IFS】はスペース・タブ・改行が指定されていることが
多いため、出力して確認しようとしても何も表示されません。

それを出力する方法になります。

  • echoで環境変数【IFS】を出力する
  • パイプでodコマンドを実行
echo "$IFS"| od -a

odコマンド:出力内容を8進数で表示。オプション【a】jは制御文字の名前で出力。
sp:スペース
ht:タブ
nl:改行