다음 스크립트를 고려해보세요.
#!/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 전용 솔루션도 작동할 것입니다.
마지막으로, 이 예에서는 두 개의 파일( blank.pdf
. )만 사용 blank2.pdf
하지만 원하는 수의 파일을 처리할 수 있는 솔루션이 필요합니다. 또한 비교를 위해 각 파일의 이전 버전과 새 버전을 함께 보관하는 것이 좋습니다. 또한 일부 파일은 원본과 새 버전에서 동일할 수 있으므로 이 경우에는 반복하지 않는 것이 좋습니다.
답변1
제공한 버전 간의 유일한 차이점은 파일 이름/매개변수입니다.
""와 같은 구문을 사용하여 거의 동일한 코드의 변형을 구별하는 것은 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 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