Unix全般 -> シェル -> Bash

位置パラメータについて

基本的な使い方

位置パラメータ一覧


$0	シェルの名を表示
$#	パラメータの数を表示
$*	全パラメータを表示

使用例

シェル /opt/script/backup.sh

#!/bin/sh

if [ -z "$1" -o -z "$2" ]; then
   echo "Usage: $0 {daily|monthly} {log|dat}"
   exit 1
fi

if [ $# -ne 2 ]; then
   echo "Usage: $0 {daily|monthly} {log|dat}"
   exit 1
fi

YM=`date +%Y%m`
DD=`date +%d`

LOG[1]=/opt/app/log/aplog
LOG[2]=/opt/app/log/access

DAT[1]=/opt/app/dat/user
DAT[2]=/opt/app/dat/list

cd /tmp

case $2 in
'log')
   for LogName in ${LOG[@]}
   do
     FILE_BASE=`basename $LogName`
     echo "tar cvf - $LogName | compress > /BackupLog/${YM}/${FILE_BASE}_$DD.tar.Z"
   done
   ;;
'dat')
   for DatName in ${DAT[@]}
   do
     FILE_BASE=`basename $DatName`
     echo "tar cvf - $DatName | compress > /BackupData/${YM}/${FILE_BASE}$_DD.tar.Z"
   done
   ;;
esac

if [ $1 = "monthly" ]; then
   case $2 in
   'log')
        cd /BackupLog/${YM}
     ;;
   'dat')
        cd /BackupDat/${YM}
     ;;
   esac
   tar cvf ${YM}.tar ${YM}
   rm -rf ${YM}
fi

exit 0

実行結果

$ /opt/script/backup.sh
Usage: /opt/script/backup.sh {daily|monthly} {log|dat}
$

パラメータ数が2個であるかをチェックしている箇所で (変数 "$#") エラーになる。

if [ $# -ne 2 ]; then

エラーになった場合シェル名を表示させる際 変数 "$0" を使用しているのでシェル名を記述する必要はない

echo "Usage: $0 {daily|monthly} {log|dat}"

応用例

シェル名にパスを表示させない場合


通常は以下のように出力されるが
$ /opt/script/backup.sh
Usage: /opt/script/backup.sh {daily|monthly} {log|dat}

パス名を表示させたくない場合、以下のように変更する
変更前: echo "Usage: $0 {daily|monthly} {log|dat}"
変更後: echo "Usage: ${0##*/} {daily|monthly} {log|dat}"

変更後の実行結果
$ /opt/script/backup.sh
Usage: backup.sh {daily|monthly} {log|dat}

 ${0##*/} は $0 の文字一致パターン ## の */ を 空白に変換するという意味となる。

これを応用すると以下の箇所も利用できる。
パス名からファイル名を抜き出す basename を使わず ${変数##*/} でファイル名のみ抽出できる。

変更前:
FILE_BASE=`basename $LogName`
echo "tar cvf - $LogName | compress > /BackupLog/${YM}/${FILE_BASE}.tar.Z"

FILE_BASE=`basename $DatName`
echo "tar cvf - $DatName | compress > /BackupData/${YM}/${FILE_BASE}.tar.Z"

変更後:(それぞれ1行で記述できる)
echo "tar cvf - $LogName | compress > /BackupLog/${YM}/${LogName##*/}.tar.Z"
echo "tar cvf - $DatName | compress > /BackupData/${YM}/${DatName##*/}.tar.Z"



${変数##*/} の "/" は他の記号でも使用できるので
${変数##*.} を使用した場合
$ FILE=backup.tar
$ echo ${FILE##*.} 
$ tar

のように拡張子のみ取り出すことができる。



先頭へ

      Document-Folder          一覧
HP-UX
HULFT
JAVA
JP1
JavaScript
Linux
MAC
PHP
Perl
Python
Ruby
SOA
Solaris
Unix全般
Windows
XML
エクセル
スタイルシート
セキュリティー
データベース
ネットワーク
パソコン
ブラウザ
プログラム構文
仮想化
          RSS-Folder
ニュース
   アットマーク・アイティ(@IT)
   シンクイット(ThinkIT)
   インターネットコム
   インターネットウォッチ
   日経IT-Pro
   日経パソコン
   CNET Japan
   ZD-NetJapan
   MYCOM
   RBB-Today
ベンダー
   日本IBM
   日本HP
   サンマイクロシステムズ
   NEC
   富士通
   日立
ソフトウェア
   マイクロソフト
   トレンドマイクロ
   オラクル
   サイボウズ
   Mozilla
   野村総合研究所
   (その他ソフトウェア企業)
更新履歴 一覧
 07/08 PERF
プログラム構文
 07/07 PERF
プログラム構文
 06/25 オブジェクトプログラミング2
Perl>サンプル
 07/12 クローン作成
仮想化>vCenter
 07/12 vyatta設定
ネットワーク>vyatta
 07/12 vyattaインストール
ネットワーク>vyatta
 07/12 リポジトリサーバ
Linux>サーバ構築
 07/05 VMwareのインストール
仮想化>VMware
 07/05 PXEブート
仮想化>KVM
 07/01 DHCPでのPXEブート
仮想化>KVM
 06/27 qcow2仮想DISK作成
仮想化>KVM
 06/13 NWの設定
仮想化>VMwareEsxi
 06/13 IPアドレスの変更
仮想化>VMwareEsxi
 06/12 自動ssh
Unix全般>シェル>Bash
 06/12 diffプログラミング
Python
Google