簡體   English   中英

如何定義具有可變數量參數的shell腳本?

[英]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.pdfmyscript *.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM