シェルの ifdef スタイル条件には以下が含まれます。

シェルの ifdef スタイル条件には以下が含まれます。

次のスクリプトを考えてみましょう。

#!/bin/sh                                                                                                                                                   

echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf
cp blank.pdf blank2.pdf

pdftk \
    A=blank.pdf `#first file` \
    B=blank2.pdf `#second file` \
    cat A B \
    output b.pdf

しかし、変形を望んでいるとしましょう。

#!/bin/sh                                                                                                                                                   

echo "" | ps2pdf -sPAPERSIZE=a4 - newblank.pdf
cp newblank.pdf newblank2.pdf

pdftk \
    A=newblank.pdf `#first file revised` \
    B=newblank2.pdf `#second file revised` \
    cat A B \
    output b.pdf

さて、彼らが一緒にいたいとしましょう。私はできます。

#!/bin/sh                                                                                                                                                   

echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf
cp blank.pdf blank2.pdf
cp blank.pdf newblank.pdf
cp blank.pdf newblank2.pdf

pdftk \
    A=blank.pdf `#first file` \
    `#A=newblank.pdf` `#first file revised` \
    B=blank2.pdf `#second file` \
    `#B=newblank2.pdf` `#second file revised` \
    cat A B \
    output b.pdf

ただし、バージョンを切り替えるにはコメントを付けてコメントを削除する必要があります。変数がCマクロスタイルで定義されているかどうかに応じてバージョンを取得できるように条件付きインクルードを実行する方法はありますか#ifdef

ポータブルシェルソリューションがあればいいのですが、そうでない場合はbash専用のソリューションも機能します。

最後に、この例では2つのファイル(blank.pdf.)のみを使用しますblank2.pdfが、必要な数のファイルを処理できるソリューションが必要です。また、比較のために、各ファイルの古いバージョンと新しいバージョンを一緒に保持することをお勧めします。また、一部のファイルは元のバージョンと新しいバージョンで同じである可能性があるため、この場合は繰り返さないことをお勧めします。

答え1

提供されたバージョン間の唯一の違いはファイル名/パラメータです。

""のような構文を使用してほぼ同じコードのバリエーションを区別することは、通常、メンテナンス不可能で重複するifdefコードにつながる可能性があるため、最善のアプローチではありません。

あなたの例では、シェル変数(およびif ... ; then小節)を使用して2つのバリアントを切り替えることができます。

 #call the script with -2 to switch to the second version.
 if [ "$1" = "-2" ]; then
           firstfile="newblank.pdf"
           secondfile="newblank2.pdf"   
 else
           firstfile="blank.pdf"
           secondfile="blank2.pdf"   
fi

echo "" | ps2pdf -sPAPERSIZE=a4 - "$infile"
cp "$firstfile" "$secondfile"

pdftk \
    "A=$firstfile" `#first file` \
    "B=$secondfile" `#second file` \
    cat A B \
    output b.pdf

少しだけ変更して同じコードを複数回呼び出すには、次のように定義することをお勧めします。functions別のパラメータを使用して呼び出します。

答え2

パラメータが値として定義される条件を取得するには、値を条件付きで拡張するだけです。

unset var
echo  ${var+" nothing because this is unset "}
var=
echo  ${var-" nothing because the value is null but the var is set "}
var=value
echo  ${var:+" this will expand    -    to my optionally provided word "} 

フォーム:+は次に展開されます。言葉変数が設定されていて空でない場合。:-に拡張される予定です。言葉設定されていないかnullの場合 - それ以外の場合はその値に展開されます。コロンのない型も[+-]似ていますが、null値の条件をすべて削除し、パラメータ設定の有無のみをテストします。

次のパラメータリストがある場合:

pdftk \
    arg arg ${first+"`#first file ${rev+revised}`"} \
    ${blank+"blankfile"} ${second+"`#second file ${rev+revised}`"}

…あなたなら成功できるかもしれません…

echo "" | ps2pdf -sPAPERSIZE=a4 - "${pre+${age:=new}}blank.pdf"
cp "${pre+$age}blank.pdf" "${pre+$age}blank2.pdf"

pdftk \
    "A=${pre+$age}blank.pdf" "`#first file${rev:+ revised: $rev}`" \
    "B=${pre+$age}blank2.pdf" "`#second file${rev:+ revised: $rev}`" \
    cat A B \
    output b.pdf

入れ子になっているので、値内で値を拡張することを選択できます。だから...

pre=+ rev=$(date) age=old your_script

...結果は非常に異なります...

unset pre rev age; your_script

関連情報