2012-04-24 25 views
22

シェルスクリプトを使用して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で呼び出されます。

答えて

34

bash変数[email protected]および$*は、コマンドライン引数のリストに展開されます。通常、"[email protected]"(つまり、二重引用符で囲まれた[email protected])を使用します。誰かがあなたのスクリプトに空白を含む引数を渡した場合、これは正しいことを行います。

つまり、あなたのスクリプトでこれを持っていた場合:

outputfile=$1 
shift 
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=$outputfile "[email protected]" 

そして、あなたは、このようなスクリプトが呼ばれる:

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

"Special Parameters"を読むに

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

これは拡大します詳細については、bashのマニュアルページのセクションを参照してください。

+0

ありがとうございます。 * last *(最初の引数ではない)引数として出力ファイル名を持つことは可能ですか? –

+0

Marius Hofert:最後の要素を簡単にシフトすることはできないので、ややこしいことです。次のようなものです: 'outputfile = $ {@:-1}; args =( "$ {@:1:$(($ {#@} - 1))}}") '。あなたはこのラルスクの答えを受け入れるべきです。 – jordanm

+0

あなたはできますが、少し醜いです。 Idelicは彼の答えの例を持っています。あなたはあなたのコードの中でより多くの悩みを解決することになります。 – larsks

18

アレイ使用、最後の引数として出力ファイルを渡すために:バージョン4の前

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

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

bashは、アレイ内の負添字を許可(及びコメントでマリウスによって報告されたエラーを生成)しませんでしたあなたが3.xを使用している場合、もっと醜いものを使用する必要があります。

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

これはbash 4.xでも有効です。最後の引数にアクセスするには

+0

私は次を取得しました: gsMerge infile1.pdf infile2.pdf all.pdf /usr/bin/gsMerge:行4:ARGS:不正な配列添え字 ****初期デバイスを開くことができません。 –

+0

@マリアス:あなたはおそらく古いバージョンの 'bash'を使っています。そのケースをカバーする答えを更新しました。 – Idelic

+0

ありがとう、Idelic、非常に良い。 –

7

は、上記Idelicの答えに加えて、あなたも行うことができます。

echo "${@: $#}" 

これは、すべての引数を読み込み、最後のものから始めて、それらを印刷します。このようにして、N個の最後の引数にアクセスすることもできます。例えば、最後の3つの引数:

echo "${@: $#-2}" 

$ ./script "what does" "this script" "do" "?" 
this script do ? 
+0

うわー、これは最高です。これはマニュアルのどこに定義されていますか?そして、これの範囲のバージョンはありますか? –

+0

配列のスプライシングについては、この回答を参照してください:[link](https://stackoverflow.com/questions/1335815/how-to-slice-an-array-in-bash)入力引数の –

関連する問題