メタキャラクタとは,ジョブ定義スクリプト内で特別な意味を持つキャラクタのことです。JP1/Advanced Shellのメタキャラクタを次に示します。
| & ; < > ( ) $ ` ' ¥ " ~ # * [ ] ?
メタキャラクタを一般的な文字として使用したい場合,メタキャラクタの無効化を行う必要があります。メタキャラクタの無効化の方法を次の表に示します。
表5-4 メタキャラクタの無効化の方法
無効化の方法 | 意味 |
---|---|
'str' | 文字列strは'以外のすべての文字をそのままの文字として処理します。 |
"str" | 文字列strは$,¥,`以外の文字をそのままの文字として処理します。 ただし,¥の直後の文字が$,¥,`,"の場合,¥はメタキャラクタとして有効となります。文字列strにそのままの文字として¥を含める場合は,¥¥と記述してください。 |
¥char | 文字charの特殊な意味を無効(エスケープ文字)にします。 |
ただし,メタキャラクタを無効化した内容を出力する場合は,echoコマンドおよびprintコマンドなど,出力する組み込みコマンドの仕様に従って処理されます。
echo 'JP1/AS¥n' # 1. |
******** JOB SCOPE STDOUT ******** |
メタキャラクタを使用した機能について説明します。
(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) 行継続
複数行にわたってコマンドを記述する場合の記述方法を次に示します。
このように記述すると行が継続していると判断し,同一行として処理されます。
(5) ワイルドカード
条件に合致するファイル名やディレクトリ名の特定,任意の文字列との比較などに,ワイルドカードが使用できます。
JP1/Advanced Shellで使用できるワイルドカードを次の表に示します。
表5-6 JP1/Advanced Shellで使用できるワイルドカード
ワイルドカード | 意味 |
---|---|
? | 任意の1文字に合致します。ただし,ドットファイルのドット「.」は除きます。 |
* | 0文字以上の文字列に合致します。ただし,ドットファイルのドット「.」は除きます。 |
[…] | [ ]に囲まれた文字列のどれか1文字に合致します。[ ]に囲まれた文字列の先頭に!を付加した場合,[ ]に囲まれていない文字に合致します。]を文字として指定する場合は,文字列の先頭に指定してください。 ハイフン(-)で区切ると,ハイフンで区切られたその間にある任意の文字(その2文字も含む)に合致します。ハイフンを文字として指定する場合は,文字列の先頭または末尾に指定してください。記述例を「表5-7 ワイルドカード[ ]の記述例」に示します。 |
{str,...} | ブレース展開によって,コンマで区切られた文字列strを展開します。ただし,次の場合は展開しません。
|
ワイルドカード[ ]の記述例を次の表に示します。
表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) 変数置換
変数置換には,変数の状態によって実行される変数置換,変数の値の文字列長や配列の要素数への変数置換,パターンマッチングの結果によって実行される変数置換があります。
表5-8 変数の状態によって実行される変数置換の書式
書式 | 説明 | 使用例 | 結果 |
---|---|---|---|
${variable:-word} | variableを変数として定義しかつ値を代入している場合,variableの値を返します。variableは定義されていますがNULLまたは未定義の場合,wordの展開結果を返します。variableの値は変更しません。 | cnt=${a:-7} | cntに7を代入 |
cnt=${b:-8} | cntに8を代入 | ||
cnt=${c:-9} | cntにcの値を代入 | ||
${variable-word} | variableを変数として定義しかつ値を代入している場合,variableの値を返します。variableは定義されていてNULLの場合,variableの値(NULL)を返します。variableが未定義のときは,wordの展開結果を返します。variableの値は変更しません。 | cnt=${a-7} | cntに7を代入 |
cnt=${b-8} | cntにNULLを代入 | ||
cnt=${c-9} | cntにcの値を代入 | ||
${variable:=word} | variableを変数として定義しかつ値を代入している場合,variableの値を返します。variableは定義されていてNULLまたは未定義の場合,wordの展開結果をvariableに代入し,variableの値を返します。ただし,この書式は変数だけに使用でき,位置パラメーターには使用できません。 | cnt=${a:=7} | aに7を代入し,cntにaの値を代入 |
cnt=${b:=8} | bに8を代入し,cntにbの値を代入 | ||
cnt=${c:=9} | cntにcの値を代入 | ||
${variable=word} | variableを変数として定義しかつ値を代入している場合,variableの値を返します。variableは定義されていてNULLの場合,variableの値(NULL)を返します。variableが未定義の場合,wordの展開結果をvariableに代入し,variableの値を返します。ただし,この書式は変数だけに使用でき,位置パラメーターには使用できません。 | cnt=${a=7} | cntに7を代入 |
cnt=${b=8} | cntにNULLを代入 | ||
cnt=${c=9} | cntにcの値を代入 | ||
${variable:?[word]} | variableを変数として定義しかつ値を代入している場合,variableの値を返します。variableは定義されていてNULLまたは未定義の場合,wordの展開結果(word省略時は未定義を表すメッセージ)を標準エラー出力に出力し,ジョブ定義スクリプトは終了します。variableの値は変更しません。 | cnt=${a:?7} | 展開結果を標準エラー出力に出力し,シェル終了 |
cnt=${a:?} | メッセージを出力し,シェル終了 | ||
cnt=${b:?8} | 展開結果を標準エラー出力に出力し,シェル終了 | ||
cnt=${c:?9} | cntにcの値を代入 | ||
${variable?[word]} | variableを変数として定義しかつ値を代入している場合,variableの値を返します。variableは定義されていてNULLの場合,variableの値(NULL)を返します。variableが未定義の場合,wordの展開結果(word省略時は未定義を表すメッセージ)を標準エラー出力に出力し,ジョブ定義スクリプトは終了します。variableの値は変更しません。 | cnt=${a?7} | 展開結果を標準エラー出力に出力し,シェル終了 |
cnt=${a?} | メッセージを出力し,シェル終了 | ||
cnt=${b?8} | cntにNULLを代入 | ||
cnt=${c?9} | cntにcの値を代入 | ||
${variable:+word} | variableを変数として定義しかつ値を代入している場合,wordの展開結果を返します。それ以外の場合は,NULLを返します。variableの値は変更しません。 | cnt=${a:+7} | cntにNULLを代入 |
cnt=${b:+8} | cntにNULLを代入 | ||
cnt=${c:+9} | cntに9を代入 | ||
${variable+word} | variableを変数として定義しかつ値を代入している場合またはNULLの場合,wordの展開結果を返します。それ以外の場合は,NULLを返します。variableの値は変更しません。 | cnt=${a+7} | cntにNULLを代入 |
cnt=${b+8} | cntに8を代入 | ||
cnt=${c+9} | cntに9を代入 |
表5-9 変数の値の文字列長および配列の要素数への変数置換の書式
書式 | 説明 |
---|---|
${#variable} | variableが「*」または「@」の場合,位置パラメーターの番号に置換されます。それ以外の場合は,variableに格納されている値の長さに置換されます。 |
${#array[*]} | arrayで指定された配列の要素数に置換されます。 |
${#array[@]} |
表5-10 パターンマッチングの結果によって実行される変数置換の書式
分類 | 書式 | 説明 |
---|---|---|
前方一致 | ${variable#pattern } | patternが変数の値の先頭と一致する場合,一致する部分で最も短い部分を削除した値に置換します。それ以外の場合はvariableの値に置換します。 |
${variable##pattern } | patternが変数の値の先頭と一致する場合,一致する部分で最も長い部分を削除した値に置換します。それ以外の場合はvariableの値に置換します。 | |
後方一致 | ${variable%pattern } | patternが変数の値の終端と一致する場合,一致する部分で最も短い部分を削除した値に置換します。それ以外の場合はvariableの値に置換します。 |
${variable%%pattern } | patternが変数の値の終端と一致する場合,一致する部分で最も長い部分を削除した値に置換します。それ以外の場合はvariableの値に置換します。 |
abc=abcd1234xyz987abcd1234efg |
******** JOB SCOPE STDOUT ******** |
abc=abcd1234xyz987abcd1234 |
******** JOB SCOPE STDOUT ******** |
(b) コマンド置換
コマンド置換の書式を次の表に示します。commandには実行するコマンド名および引数を指定します。
Windowsの場合,コマンド置換は外部コマンドを除いてカレントプロセスで実行されます。
表5-11 コマンド置換の書式
書式名 | 書式 | 説明 |
---|---|---|
$( )形式 | $(command) | commandの文字列に「¥」が含まれていても「¥」は意味を持ちません。 |
逆引用符形式 | `command` | commandの文字列に「¥」が含まれていると「¥」は意味を持ちます。 コマンド置換の中にコマンド置換を記述する場合,`command ¥`command¥``のように内側の逆引用符の直前に「¥」を記述してください。 |
$( )形式と逆引用符形式では,commandの文字列に「¥」が含まれている場合,動作が異なります。逆引用符形式でcommandの文字列に「¥」が含まれていると,「¥」はメタキャラクタとして扱われます。そのため,実行結果に違いがあります。実行例および実行結果を次に示します。
echo $(echo '¥$x') |
¥$x |
echo `echo '¥$x'` |
$x |
(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.カレントディレクトリに存在するファイルを表示 |
実行ジョブのSTDOUTファイルの内容
******** JOB SCOPE STDOUT ******** |
ファイル名の先頭文字がドット(.)の場合は,パターンとの合致対象から外されます。先頭文字がドットのファイル名をパターンとの合致対象に含める場合は,明示的にドットを指定する必要があります。
(7) 算術展開
算術展開とは,算術をした上でその結果に置き換えることです。算術展開の書式と実行例を次に示します。
$((算術式)) |
ジョブ定義スクリプトの内容
x=100 # 1.xに代入されている値は100 |
実行ジョブのSTDOUTファイルの内容
******** JOB SCOPE STDOUT ******** |
(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 | バックグラウンドプロセスの入力は標準入力からとなります。 |
(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コマンドを指定したときは,標準出力の内容を変数に代入するため,カレントプロセスで実行されます。使用例を次に示します。
ls | grep xxx | read STR |
alias READ="read STR" |
ls | grep xxx | { read STR; } |
パイプラインは次の条件のどれかを満たした場合,構文不正でエラー終了します。
(例) | wc -l | bc
(例) ls | | bc
(例) ls | wc -l |
<EOF>
ジョブ定義スクリプト実行時にパイプラインで実行するコマンドが指定されていないことを検出した場合,その内容を示すメッセージを出力します。
ジョブ定義スクリプトの内容
alias ls="ls -lt" |
実行ジョブのJOBLOGファイルの内容
<省略> |
(9) コマンドセパレータ
コマンドセパレータを使用すると,ジョブ定義スクリプトの1行に複数のコマンドを記述できます。コマンドセパレータに関する書式を次の表に示します。
表5-16 コマンドセパレータに関する書式
書式 | 意味 |
---|---|
command; | セミコロン(;)までをコマンドおよびコマンド引数として解釈します。 |
command_1△0&&△0command_2 | AND制御演算子です。左項のコマンドが終了コード0で終了すると,右項のコマンドを実行します。 |
command_1△0||△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(改行) ...(改行) } |
(11) そのほかのメタキャラクタ
そのほかに,次の表に示すメタキャラクタが使用できます。
メタキャラクタ | 意味 |
---|---|
~ | シェル変数のHOMEに置き換えられます。 |
~任意の文字列 | 【UNIX限定】 /または引数区切り文字までの文字列と一致するユーザー名が/etc/passwdファイルに登録されているか確認します。 登録されている場合は,一致するユーザーのログインディレクトリに置き換えられます。 登録されていない場合は,そのままの文字列として解釈されます。 |
~+ | シェル変数のPWDに置き換えられます。 |
~- | シェル変数のOLDPWDに置き換えられます。 |
& | ジョブ定義スクリプトや関数をバックグラウンドで実行します。 |