условные включения 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 AB \ 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 AB \ 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 AB \ output b.pdf 

Но если я хочу переключаться между версиями, я должен комментировать и раскомментировать вещи. Есть ли способ сделать условное включение, чтобы я мог (скажем) получить одну версию в зависимости от того, определена ли переменная или нет, в стиле макроса #ifdef C?

Было бы неплохо иметь портативное решение для оболочки, но если нет, то тоже будет работать с bash.

Наконец, я просто использую два файла в этом примере ( blank.pdf . blank2.pdf ), но мне нужно решение, которое работает с произвольным количеством файлов. Кроме того, предпочтительной будет версия, которая имеет старые и новые версии каждого файла рядом друг с другом для целей сравнения. Кроме того, некоторые из файлов могут быть одинаковыми как в оригинальной, так и в новой версиях, поэтому было бы неплохо повторить их в этом случае.

Разница между версиями, которые вы указали, – это только разные имена файлов / аргументы.

Дифференцируя варианты более или менее одного и того же кода с структурами типа « ifdef », как правило, не самый лучший способ, поскольку это приводит к малоподдерживаемому и дублируемому коду.

В примере вашего примера вы можете, например, использовать переменные оболочки (и один маленький, if ... ; then предложение) для переключения между двумя вариантами:

  #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 AB \ output b.pdf 

Если вы хотите иметь несколько вызовов одного и того же кода с небольшими изменениями, вы можете рассмотреть возможность определения functions и называть их разными аргументами.

Чтобы получить аргумент как условие определения значения, вы можете просто условно расширить значение.

 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 "} 

Форма :+ будет расширяться до слова, когда переменная установлена ​​и не равна нулю. :- будет расширяться до слова, когда он либо не установлен, либо равен нулю, иначе он будет расширяться до своего значения в противном случае. [+-] формы без двоеточия аналогичны, но при любых условиях исключают нулевые значения и только tesr – параметр для того, установлен ли он.

Если у вас есть список аргументов, например:

 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 AB \ output b.pdf 

Поскольку они гнездятся, вы можете дополнительно расширить значение в пределах значения. Так…

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

… будет отличаться от …

 unset pre rev age; your_script