スクリプトジョブの引数にパスを渡す方法について
お世話になります。
フォームからファイルを指定し実行するジョブフローにおいてスクリプトジョブを呼び出しています。
スクリプトジョブの引数として、処理をしたいファイル群を*を使用したパスを指定したところ、フォームで選択した数に合わせてスクリプトジョブへ渡される引数の数が変わってしまいました。
コードと実行結果は下記の通りです。
■ジョブフロー
| files |
{ for file in files |
print("下記のファイルを配置します。") ->
print(file.name) ->
download(from_file = file, to_path = "/tmp/test")
}->
[ /kompira/scriptjob/scriptsample:'/tmp/test/*.txt' ]
■スクリプトジョブ
echo $#
■ファイル1つ指定の場合の実行結果
1
■ファイル2つ指定の場合の実行結果
2
結果から判断するに、'/tmp/test/*.txt'の文字列そのものがスクリプトジョブの引数になっていないように見えます。文字列そのものを引数とする場合にはどのように記述すれば良いでしょうか?
よろしくお願いいたします。
-
ご質問ありがとうございます
ScriptJob はデフォルトで内部的にシェル(/bin/bash)を経由して呼び出されるため、コマンドライン中で引用符で囲まれていないワイルドカード(* など)はシェルによって展開されます。例:
```
scriptsample.sh /tmp/test/*.txt
```
この場合、アスタリスクはシェルによって展開され、argv は以下のようになります:
```
/tmp/test/file1.txt /tmp/test/file2.txt …
```
そのため、引数の数はディレクトリ内で一致するファイルの数に応じて変動し、$# は 1, 2, 3 … のように変化します。
ワイルドカードをリテラル文字列として扱う方法シェルに解釈させず、スクリプトにそのまま "/tmp/test/*.txt" を渡したい場合は、アスタリスクをエスケープまたは引用符で囲む必要があります。
方法1:バックスラッシュを重ねる
```jobflow
[ /kompira/scriptjob/scriptsample: '/tmp/test/\\*.txt' ]
```
方法2:追加の引用符を使う
```jobflow
[ /kompira/scriptjob/scriptsample: "'/tmp/test/*.txt'" ]
```どちらの場合も、シェルが受け取る引数はリテラル文字列 /tmp/test/*.txt になり、スクリプトは「1つのパラメータ」としてこれを受け取ります。
どうぞ、よろしくお願いいたします。
サインインしてコメントを残してください。
コメント
2件のコメント