[英]How to define a shell script with variable number of arguments?
我想定義一個通過 shell 腳本調用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
調用此腳本。
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
手冊頁的“特殊參數”部分以獲取更多信息。
要將輸出文件作為最后一個參數傳遞,請使用數組:
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。
要訪問最后一個參數,除了上面的 Idelic 的答案,您還可以執行以下操作:
echo "${@: $#}"
這將讀取所有參數並從最后一個開始打印它們。 這樣,您還可以訪問 N 個最后一個參數,例如最后三個參數:
echo "${@: $#-2}"
$ ./script "what does" "this script" "do" "?"
this script do ?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.