40

gsシェル スクリプトを介した (ghostscript) への呼び出しの簡単な省略形を定義したいと思います。最初の引数はマージするすべてのファイルを指定し、最後の引数は出力ファイルの名前を指定します。明らかに、以下は機能しません (ゴールを表示するためだけです):

#!/bin/sh
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=$last $1 $2 ...

これはどのように行うことができますか?

通常、このスクリプトはmyscript infile1.pdf infile2.pdf ... outfile.pdfまたはを介し​​て呼び出しますmyscript *.pdf outfile.pdf

4

3 に答える 3

66

bash 変数は、コマンド ライン引数のリストに展開されます$@$*一般に、使用する必要があります"$@"(つまり、$@二重引用符で囲みます)。これは、誰かが空白を含む引数をスクリプトに渡した場合に正しいことを行います。

したがって、スクリプトにこれがある場合:

outputfile=$1
shift
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=$outputfile "$@"

そして、次のようにスクリプトを呼び出しました。

myscript out.pdf foo.ps bar.ps "another file.ps"

これは次のように展開されます。

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=out.pdf foo.ps bar.ps "another file.ps"

詳細については、マニュアル ページの「特別なパラメータ」セクションをbash参照してください。

于 2012-04-24T23:17:41.827 に答える
21

出力ファイルを最後の引数として渡すには、配列を使用します。

ARGS=("$@")
# Get the last argument
outputfile=${ARGS[-1]}
# Drop it from the array
unset ARGS[${#ARGS[@]}-1]

exec gs ... -sOUTPUTFILE=$outputfile "${ARGS[@]}"

バージョン 4 より前でbashは、配列に負の添え字を使用できませんでした (そして、Marius によってコメントで報告されたエラーが生成されました)。そのため、3.x を使用している場合は、より醜い

outputfile=${ARGS[${#ARGS[@]}-1]}

これは bash 4.x でも機能します。

于 2012-04-25T01:51:34.560 に答える