kobapan@wiLiki
Login
Linux

Linux:bash

目次

引数(位置パラメータ)の処理

example.sh

#!/usr/bin/env bash 
echo $0 
echo $1
echo $2 
echo $3

実行結果

$ bash example.sh a1 a2 a3
example.sh
a1 
a2
a3

位置パラメータへのアクセス書式

$0 実行中のファイル名
$1 1番めの変数
$2 2番めの変数
$N N番めの変数(0-9)だけ
${N} N番めの変数、10番以降は必須
$@ $1..$N までの引数配列すべて
$* $@と同じ。ただしIFS区切り
$# 引数の個数。$0は除く
${@: X: n} x番目からN個のスライス

※IFS とは $' ¥t¥n' つまり(スペース・タブ・改行)

引数をすべて、なくなるまで処理

while [ "$1" ]
do
    echo "$1"
    shift
done

もしくは

for i ; do 
    echo $i;
done

コマンドオプションを処理する

while :
do
    case "$1" in
      -f | --file)
      file="$2"   # You may want to check validity of $2
      shift 2
      ;;
      -*)
      echo "Error: Unknown option: $1" >&2
      exit 1
      ;;
      *)  # No more options
      break
      ;;
    esac
done

もしくは

while getopts ab:c: OPT
do
  case $OPT in
    "a" ) FLG_A="TRUE" ;;
    "b" ) FLG_B="TRUE" ; VALUE_B="$OPTARG" ;;
    "c" ) FLG_C="TRUE" ; VALUE_C="$OPTARG" ;;
  esac
done

getopts コマンドの第一引数にはシェルスクリプトに指定可能なオプションを指定し、さらそのオプションが値を要する場合は : (コロン) を付ける。上記の例では「$ command -a -b "BBB" -c "CCC"」といったコマンドラインになる。

テキスト処理

ファイルを行ごとに読み込んで処理。or文は最終行に改行コードがない場合の対応。

while read LINE || [ -n "${LINE}" ]; do
  echo "LINE: ${LINE}"
done < /tmp/test.txt

IFS区切りで読み込んで処理

$ touch " abc  " "ho  ge" $'\txyz'
$ ls | while IFS= read f; do echo "[$f]"; done
[   xyz]
[ abc  ]
[ho  ge]

IFSを削除しながら読み込み

$ ls | while read f; do echo "[$f]"; done
[xyz]
[abc]
[ho  ge]

部分文字列の取得(スライス substr)

${パラメータ:オフセット:長さ}

$ str='abcdef'
$ echo ${str:3}
def
$ echo ${str:3:1}
d
$ echo ${str:0:2}
ab
$ echo ${str:0:-2}
abcd

% 右端からのパターン一致除外

$ HOGE=hoge.tar.bz2
$ echo ${HOGE}
hoge.tar.bz2
# 最短除外
$ echo ${HOGE%.*}
hoge.tar
# 最長除外
$ echo ${HOGE%%.*}
hoge

# 左端からのパターン一致除外

$ HOGE=/home/user/hoge
$ echo ${HOGE}
/home/user/hoge
# 最短除外
$ echo ${HOGE#*/}
home/user/hoge
# 最長除外
$ echo ${HOGE##*/}
hoge

Debian
Emacs
Firefox
Gauche
JavaScript
Linux
Scheme
org-mode/latex

More ...