JP1/Advanced Shell

[目次][用語][索引][前へ][次へ]


5.1.5 メタキャラクタ

メタキャラクタとは,ジョブ定義スクリプト内で特別な意味を持つキャラクタのことです。JP1/Advanced Shellのメタキャラクタを次に示します。

| & ; < > ( ) $ ` ' \ " ~ # * [ ] ?

メタキャラクタを一般的な文字として使用したい場合,メタキャラクタの無効化を行う必要があります。メタキャラクタの無効化の方法を次の表に示します。

表5-4 メタキャラクタの無効化の方法

無効化の方法 意味
'str' 文字列strは'以外のすべての文字をそのままの文字として処理します。
"str" 文字列strは$,\,`以外の文字をそのままの文字として処理します。
ただし,\の直後の文字が$,\,`,"の場合,\はメタキャラクタとして有効となります。文字列strにそのままの文字として\を含める場合は,\\と記述してください。
\char 文字charの特殊な意味を無効(エスケープ文字)にします。

ただし,メタキャラクタを無効化した内容を出力する場合は,echoコマンドおよびprintコマンドなど,出力する組み込みコマンドの仕様に従って処理されます。

ジョブ定義スクリプトの内容
 
echo 'JP1/AS\n'        # 1.
echo "JP1/AS\n"        # 2.
echo JP1/AS\\n         # 3.
echo 'JP1/AS\\n'       # 4.
 

実行ジョブのSTDOUTファイルの内容
 
********   JOB SCOPE STDOUT    ********
JP1/AS        ←1.の結果 echoコマンドが\nを改行として出力
 
JP1/AS        ←2.の結果
 
JP1/AS        ←3.の結果
 
JP1/AS\n      ←4.の結果 \をエスケープ扱いで\nを文字として出力
 

メタキャラクタを使用した機能について説明します。

<この項の構成>
(1) 位置パラメーター
(2) 文字列区切り
(3) コメント
(4) 行継続
(5) ワイルドカード
(6) 置換
(7) 算術展開
(8) 入出力リダイレクト
(9) コマンドセパレータ
(10) コマンドのグループ化
(11) そのほかのメタキャラクタ

(1) 位置パラメーター

ジョブ定義スクリプトを実行する場合,ジョブ定義スクリプトファイル名の後ろに実行時パラメーターを指定すると,ジョブ定義スクリプトに引数として渡すことができます。JP1/Advanced Shellはこの引数を「位置パラメーター」と呼ぶ特殊な変数に代入します。位置パラメーターは「$0」から「$9」の10個が用意されており,「$0」には実行したジョブ定義スクリプトファイル名が代入されます。$1から$9には指定した順に引数が代入されます。JP1/Advanced Shellの位置パラメーターおよび関連する特殊文字について次の表に示します。

表5-5 JP1/Advanced Shellの位置パラメーターおよび関連する特殊文字

位置パラメーターおよび特殊文字 意味
位置パラメーター $0 ジョブ定義スクリプトのファイル名です。
$n ジョブ定義スクリプトに指定した第n引数の値(nは1〜9まで)です。
関連する特殊文字 $# ジョブ定義スクリプトに指定した引数の数です。
$* ジョブ定義スクリプトに指定した引数すべてです。
$@ ジョブ定義スクリプトに指定した引数すべてです。
"$*" ジョブ定義スクリプトに指定した引数すべてを一まとめにして扱います。
 例:"$1 $2 $3 ... "
IFSシェル変数を変更していた場合,IFSシェル変数の値で区切られます。
"$@" ジョブ定義スクリプトに指定した引数すべてを個別に扱います。
 例:"$1" "$2" ... "
IFSシェル変数を変更していた場合,スペースで区切られます。

ジョブ定義スクリプト内で位置パラメーターを変更するには,シェル標準コマンドのsetコマンドを使用します。setコマンドについては,「9.3 シェル標準コマンド」の「setコマンド(シェルオプションを設定する,配列を作成する,または変数の値を表示する)」を参照してください。

(2) 文字列区切り

JP1/Advanced Shellは,IFSシェル変数に指定された文字を「文字列を区切る文字」として扱います。IFSシェル変数の初期値はスペース,タブ文字または改行文字であるため,スペースおよびタブ文字が文字列の区切りとして扱われます。複数のスペース,タブ文字が連続しても,1つの区切り文字として扱われます。IFSシェル変数の詳細については,「5.5 シェル変数」を参照してください。

また,スペースやタブ文字を文字列として使用する場合は,スペース,タブ文字を含む文字列をクォーテーション(’および”)で囲む必要があります。

(3) コメント

ジョブ定義スクリプト内にコメントを記述できます。行中に「#」を記述すると,「#」以降から行末までをコメントとして扱い,処理を行います。ただし,「#」の後ろに「-adsh」が記述されている場合は,次のように処理をします。

(4) 行継続

複数行にわたってコマンドを記述する場合の記述方法を次に示します。

  1. 行の終端に\を付けて改行します。
  2. 行の終端をクォーテーションで囲まないで改行し,複数行の最初と最後だけクォーテーションで囲みます。

このように記述すると行が継続していると判断し,同一行として処理されます。

(5) ワイルドカード

条件に合致するファイル名やディレクトリ名の特定,任意の文字列との比較などに,ワイルドカードが使用できます。

JP1/Advanced Shellで使用できるワイルドカードを次の表に示します。

表5-6 JP1/Advanced Shellで使用できるワイルドカード

ワイルドカード 意味
? 任意の1文字に合致します。ただし,ドットファイルのドット「.」は除きます。
* 0文字以上の文字列に合致します。ただし,ドットファイルのドット「.」は除きます。
[…] [ ]に囲まれた文字列のどれか1文字に合致します。[ ]に囲まれた文字列の先頭に!を付加した場合,[ ]に囲まれていない文字に合致します。]を文字として指定する場合は,文字列の先頭に指定してください。
ハイフン(-)で区切ると,ハイフンで区切られたその間にある任意の文字(その2文字も含む)に合致します。ハイフンを文字として指定する場合は,文字列の先頭または末尾に指定してください。記述例を「表5-7 ワイルドカード[ ]の記述例」に示します。
{str,...} ブレース展開によって,コンマで区切られた文字列strを展開します。ただし,次の場合は展開しません。
  • braceexpandシェルオプションが無効の場合
  • noglobシェルオプションが有効の場合

ワイルドカード[ ]の記述例を次の表に示します。

表5-7 ワイルドカード[ ]の記述例

記述例 意味
[]a] 文字列]aと合致します。
[!abc] 文字列abc以外と合致します。
[0-9] 0から9までのどれかに合致します。
[a-z] 英小文字に合致します。
[A-Z] 英大文字に合致します。
[0-9a-zA-Z] 英数字に含まれます。
[-abc] 文字列-abcと合致します。
[!-abc] 文字列-abc以外と合致します。

(6) 置換

置換機能として次の3つの機能があります。

(a) 変数置換

変数置換には,変数の状態によって実行される変数置換,変数の値の文字列長や配列の要素数への変数置換,パターンマッチングの結果によって実行される変数置換があります。

(b) コマンド置換

コマンド置換の書式を次の表に示します。commandには実行するコマンド名および引数を指定します。

Windowsの場合,コマンド置換は外部コマンドを除いてカレントプロセスで実行されます。

表5-11 コマンド置換の書式

書式名 書式 説明
$( )形式 $(command) commandの文字列に「\」が含まれていても「\」は意味を持ちません。
逆引用符形式 `command` commandの文字列に「\」が含まれていると「\」は意味を持ちます。
コマンド置換の中にコマンド置換を記述する場合,`command \`command\``のように内側の逆引用符の直前に「\」を記述してください。

$( )形式と逆引用符形式では,commandの文字列に「\」が含まれている場合,動作が異なります。逆引用符形式でcommandの文字列に「\」が含まれていると,「\」はメタキャラクタとして扱われます。そのため,実行結果に違いがあります。実行例および実行結果を次に示します。

(c) ファイル名置換

ファイル名置換の書式を次の表に示します。patternはパターンマッチングを行う文字列を指定します。patternにはワイルドカードによる指定もできます。

表5-12 複数パターンによるファイル名置換の書式

書式 意味 使用例 一致する文字列
?(pattern|pattern ...) patternに指定された文字列のうち,どれか1つと合致します。 ?(h) 空文字列,h
*(pattern|pattern ...) patternに指定された文字列のうち,0または1つ以上と合致します。 *(h) 空文字列,h,h,hh,hhh,…
+(pattern|pattern ...) patternに指定された文字列のうち,1つ以上と合致します。 +(h) h,hh,hhh,…
@(pattern|pattern ...) patternに指定された文字列のうち,1つだけ合致します。 @(h) h
!(pattern|pattern ...) patternに指定された文字列のうち,1つを除くすべてと合致します。 !(h) hを除く任意の文字列

1つ以上のパターンを「|」で区切ることで,複数のパターンを同時に指定し,合致するファイル名を置換できます。ただし,パターンの区切り文字である「|」の前後にスペースを挿入しないでください。また,パターンの前後にスペースを挿入した場合,スペースもパターンの一部として扱われます。

使用例を次に示します。

ファイル名置換の使用例

ジョブ定義スクリプトの内容

 
ls                     # 1.カレントディレクトリに存在するファイルを表示
ls ?(*.sh|*.exe|*.dot) # 2.拡張子がsh,exec,dotのどれかのファイル名を表示
ls *(*.sh|*.exe)       # 3.拡張子がsh,exeのどちらかのファイル名を表示
ls +(*.jhs|*h)         # 4.拡張子がjhsまたは終端がhのファイル名を表示
ls @(*.c|*.jhs)        # 5.拡張子がcまたはjhsのファイル名を表示
ls !(*.c|*.jhs)        # 6.拡張子cまたはjhs以外のファイル名を表示
 

実行ジョブのSTDOUTファイルの内容

 
********   JOB SCOPE STDOUT    ********
a.jhs  a.sh  a.txt  func.c  ←1.の実行結果 
a.sh                        ←2.の実行結果 
a.sh                        ←3.の実行結果
a.jhs  a.sh                 ←4.の実行結果
a.jhs  func.c               ←5.の実行結果
a.sh  a.txt                 ←6.の実行結果
 

ファイル名の先頭文字がドット(.)の場合は,パターンとの合致対象から外されます。先頭文字がドットのファイル名をパターンとの合致対象に含める場合は,明示的にドットを指定する必要があります。

(7) 算術展開

算術展開とは,算術をした上でその結果に置き換えることです。算術展開の書式と実行例を次に示します。

 
$((算術式))
 

算術展開の実行例

ジョブ定義スクリプトの内容

 
x=100          # 1.xに代入されている値は100
x=$(($x-1))    # 2.算術を実行し,その結果をxに代入する
echo $x        # 3.変数xの値を標準出力へ出力する
 

実行ジョブのSTDOUTファイルの内容

 
********   JOB SCOPE STDOUT    ********
99             ←xに代入されている値は99
 

(8) 入出力リダイレクト

ジョブ定義スクリプトでは,コマンド実行前に実行結果の出力先の変更やコマンド実行に必要な情報の入力先を変更できます。これを入出力リダイレクトといいます。JP1/Advanced Shellで使用できる入出力リダイレクトについて説明します。

(a) リダイレクト

JP1/Advanced Shellで使用できるリダイレクトを次の表に示します。リダイレクトは左から右に解釈されます。

表5-13 JP1/Advanced Shellで使用できるリダイレクト

リダイレクト 意味
>file fileを標準出力として使用します。fileが存在しない場合は,ファイルを作成します。すでにfileが存在する場合は,上書きします。
< file fileを標準入力として使用します。
command_1 | command_2 パイプです。command_1の標準出力をcommand_2の標準入力とします。
>>file fileを標準出力として使用します。fileが存在しない場合は,ファイルを作成します。すでにfileが存在する場合は,追記します。
>|file fileを標準出力として使用します。fileが存在しない場合は,ファイルを作成します。すでにfileが存在する場合は,上書きします。
<>file fileを読み取りと書き込みのために標準入力としてオープンします。
<<label ヒアドキュメントです。
n>file n番のファイルディスクリプタの出力先をfileにします。
n<file n番のファイルディスクリプタはfileから入力します。
>&n 標準出力をn番ファイルディスクリプタにコピーします。
<&n 標準入力をn番ファイルディスクリプタからコピーします。
>&- 標準出力をクローズします。
<&- 標準入力をクローズします。
|&※1 UNIXの場合,親プロセスからの入出力を伴うバックグラウンドプロセスを起動します。
>&p※2 バックグラウンドプロセスの出力先を標準出力とします。
<&p※2 バックグラウンドプロセスの入力は標準入力からとなります。

注※1
「|&」を使用して,親プロセスからの入出力を伴うバックグラウンドプロセスを複数起動しようとすると,KNAX6029-Eメッセージが出力され,ジョブ定義スクリプトがエラー終了する場合があります。そのため,「|&」を使用する場合は,waitコマンドなどを使用し,バックグラウンドプロセスを複数同時に起動しないようにしてください。

注※2
Windowsの実行環境の場合,バックグラウンドプロセスを生成できないため使用できません。

(b) ファイルディスクリプタ

JP1/Advanced Shellの入出力種別ごとのファイルディスクリプタを次の表に示します。

表5-14 JP1/Advanced Shellの入出力種別ごとのファイルディスクリプタ

入出力種別 ファイルディスクリプタ 備考
標準入力 0
標準出力 1 WindowsまたはLinuxで,adshexecコマンドの-sオプションおよび環境ファイルのOUTPUT_STDOUTパラメーターにSPOOLを指定した場合,JP1/Advanced ShellがシェルからスプールのSTDOUTへの出力(stdout)として使用しているため,このファイルディスクリプタで端末をオープンしていません。
標準エラー出力 2 JP1/Advanced ShellがシェルからスプールのSTDERRへの出力(stderr)として使用しているため,このファイルディスクリプタで端末をオープンしていません。
上記以外 3〜9 ユーザーがジョブ定義スクリプト内で使用できるファイルディスクリプタです。

(凡例)
−:特になし。

(c) ヒアドキュメント

ヒアドキュメントとは,標準入力をジョブ定義スクリプト内で生成することです。ヒアドキュメントに関する書式を次の表に示します。

表5-15 ヒアドキュメントに関する書式

書式 意味
<< label
document
label
labelに囲まれたdocumentの部分が標準入力に渡されます。documentの部分に記述された変数は置換され,スペース,タブ文字はそのまま標準入力に渡されます。
<<- label
document
label
labelに囲まれたdocumentの部分が標準入力に渡されます。documentの部分に記述された変数は置換され,スペースはそのまま標準入力に渡されます。しかし,各行の行頭のタブ文字は削除されます。
<< \label
document
label
labelに囲まれたdocumentの部分が標準入力に渡されます。documentの部分に記述された変数は置換されません。
<< 'label'
document
label

(d) パイプ

複数のコマンドを接続し,1つのコマンドの標準出力を別のコマンドの標準入力として使用したい場合に,パイプでコマンドを接続します。パイプで接続されたコマンドのセットをパイプラインと呼びます。

Windowsの場合,パイプラインのコマンドは逐次的に実行されます。組み込みコマンド,関数,外部コマンドのうち,外部コマンドだけは別プロセスで実行されます。また,コマンド間のデータの受け渡しに一時ファイルを使用します。

UNIXの場合,パイプラインは左から右へ処理が行われ,パイプラインのコマンドは別々のプロセスとして実行されます。ただし,最後の命令に直接,またはエイリアス定義によってreadコマンドを指定したときは,標準出力の内容を変数に代入するため,カレントプロセスで実行されます。使用例を次に示します。

パイプラインは次の条件のどれかを満たした場合,構文不正でエラー終了します。

  1. パイプラインの先頭のコマンドを指定していない。
    (例) | wc -l | bc
  2. パイプとパイプの間のコマンドを指定していない。
    (例) ls | | bc
  3. パイプラインの最後のコマンドを指定しないでファイルの終端に達した。
    (例) ls | wc -l | 
         <EOF>

ジョブ定義スクリプト実行時にパイプラインで実行するコマンドが指定されていないことを検出した場合,その内容を示すメッセージを出力します。

ジョブ定義スクリプトの内容

 
alias ls="ls -lt"
ls | >&2
 

実行ジョブのJOBLOGファイルの内容

 
<省略>
********  JP1/Advanced Shell MESSAGE  ********
13:12:08 034767 KNAX0091-I ADSH034767 Job started.
13:12:08 034767 KNAX6520-I Command alias(line=1) succeeded. rc=0 E-Time=0.000s C-Time=0.000s
13:12:08 034767 KNAX6043-W Command to execute in another process is not specified. filename="/home/jp1as/script/pipe.ash" line=2 
13:12:08 034767 KNAX6522-E Command ls(line=2) ended abnormally because the command received a signal. rc=141 signalNo=13 E-Time=0.013s C-Time=0.010s
13:12:08 034767 KNAX6540-I Another process script(line=2) succeeded. rc=0 E-Time=0.003s C-Time=0.000s
13:12:08 034767 KNAX0101-E ADSH034767 An error occurred during execution of job.
13:12:08 034767 KNAX0098-I ADSH034767 Job ended. rc=0 E-Time=0.016s C-Time=0.010s
 

注※
KNAX6043-Wメッセージが出力されます。

(9) コマンドセパレータ

コマンドセパレータを使用すると,ジョブ定義スクリプトの1行に複数のコマンドを記述できます。コマンドセパレータに関する書式を次の表に示します。

表5-16 コマンドセパレータに関する書式

書式 意味
command; セミコロン(;)までをコマンドおよびコマンド引数として解釈します。
command_10&&△0command_2 AND制御演算子です。左項のコマンドが終了コード0で終了すると,右項のコマンドを実行します。
command_10||△0command_2 OR制御演算子です。左項のコマンドが終了コード0以外で終了すると,右項のコマンドを実行します。

また,コマンドセパレータは,グループ化したコマンドを1つのコマンド群として扱い,実行できます。

(10) コマンドのグループ化

コマンドをグループ化すると,複数のコマンドをまとめて実行できます。また,グループ化したコマンド群をグループ化することもできます。コマンドのグループ化に関する書式を次の表に示します。

表5-17 コマンドのグループ化に関する書式

書式 意味
(command _1;△0command _2; ... ) サブシェル(子プロセス)でグループ化されたコマンドを実行します。コマンド実行中に環境を変更しても変更内容はカレントシェルに引き継がれません。グループ化するコマンドはセミコロンまたは改行文字で区切ります。
(command_1(改行)
command_2(改行)
... )
{△1command_1;△0command _2; ...;} カレントシェルでグループ化されたコマンドを実行します。コマンド実行中に環境を変更すると変更内容がコマンド終了後も引き継がれます。グループ化するコマンドはセミコロンまたは改行文字で区切ります。
この書式の場合,「{」の後ろに1つ以上のスペースを挿入しかつ最後のコマンドにセミコロン(;)または改行文字を挿入してください。
{△1command_1(改行)
command_2(改行)
...(改行)
}

注※
Windowsの実行環境の場合,サブシェル(子プロセス)でグループ化されたコマンドの実行はサポートしていません。

(11) そのほかのメタキャラクタ

そのほかに,次の表に示すメタキャラクタが使用できます。

メタキャラクタ 意味
~ シェル変数のHOMEに置き換えられます。
~任意の文字列 【UNIX限定】
/または引数区切り文字までの文字列と一致するユーザー名が/etc/passwdファイルに登録されているか確認します。
登録されている場合は,一致するユーザーのログインディレクトリに置き換えられます。
登録されていない場合は,そのままの文字列として解釈されます。
~+ シェル変数のPWDに置き換えられます。
~- シェル変数のOLDPWDに置き換えられます。
& ジョブ定義スクリプトや関数をバックグラウンドで実行します。

注1
「~」,「~+」および「~-」は,クォーテーションで囲んだり,クォーテーションで囲まれた文字列やエスケープ文字(\)の直前に記述されたりすると,対応するシェル変数に置き換わりません。このような場合はシェル変数を使用してください。

注2
$HOME変数は自動では設定されません。環境変数として定義してください。

注3
「&」はWindowsの実行環境ではサポートしていません。

[目次][前へ][次へ]


[他社商品名称に関する表示]

All Rights Reserved. Copyright (C) 2011, 2012, Hitachi, Ltd.