我正在構建一個腳本(linux bash),我需要在其中傳遞一定數量的引數,它可以是 7 個或 8 個引數。
如果我傳遞 7 個引數,我會這樣做:
我的腳本.sh
!/bin/bash
arg1=$1
arg2=$2
arg3=$3
arg4=$4
arg5=$5
arg6=$6
arg7=$7
#Do other stuff after this
我像這樣運行它:./my_script.sh 1 2 3 4 5 6 7
我希望能夠在這個腳本中添加一個可選的第 8 個引數。所以想法是有時使用第 8 個引數運行腳本,其余時間僅使用 7 個引數。我怎樣才能做到這一點?
uj5u.com熱心網友回復:
你可以這樣做:
if [[ $8 != '' ]]
then
# do something
fi
另外,如果你這樣做
arg8=$8
如果沒有第八個引數,則 arg8 將保持為空。
uj5u.com熱心網友回復:
另一個想法。分配前 7 個引數后,使用shift 7將它們從位置引數中清除。然后,任何額外的引數都在"$@"并且數字在$#
arg1=$1
arg2=$2
arg3=$3
arg4=$4
arg5=$5
arg6=$6
arg7=$7
shift 7
echo "There are $# extra parameters"
for arg in "$@"; do
echo "-> $arg"
done
uj5u.com熱心網友回復:
您可以檢查 的值$#,例如。
#!/usr/bin/env bash
if (($# == 8)); then
printf '%d arguments given\n' "$#"
elif (($# > 8)); then
printf '%d is greater than 8\n' "$#"
elif (($# < 8)); then
printf '%d is Less than 8\n' "$#"
fi
測驗該腳本。
my_script {1..8}
輸出
8 arguments given
my_script {1..87}
輸出
87 is greater than 8
my_script {1..7}
輸出
7 is Less than 8
uj5u.com熱心網友回復:
這是很多爭論。每次都需要它們嗎?你能默認一些嗎?
基本上,我看到了三個主要案例。
您有一個固定位置所需引數的串列。如果它們都是真正需要的,并且你永遠不能為它們中的任何一個假設默認值,那么 positional 實際上很好,因為它簡化了你的編碼......但是一旦你引入可選引數,你就應該認真開始考慮
getopts.如果您只有一個可選引數,那么只需分配
arg8=$8而不用擔心它 - 但是一旦您有兩個,那么您真的需要考慮其含義。如果您需要$9但并不真正關心,$8那么您必須傳入一個虛擬值$8來填充. 不要去那里。$9在大多數情況下,除非腳本真的很簡單(而我的幾乎從來沒有),否則您應該使用
getopts.
假設您正在撰寫一個計算使用分鐘數的電信腳本。該腳本絕對需要來自用戶的 3 個引數 - 對于我們的示例,假設您需要$state,$mmyy并按$stream州和月/年以及本地或長途識別輸入檔案。(如果這是您的喜好,您總是可以將其作為$STMMYYLT或某種方式傳遞,以將其簡化為一個論點,但一般來說,讓一件事成為一件事。)
有了這些,您可以運行它并獲得總分鐘數。偉大的。
但有時您需要按帳戶對它們進行細分。有時意味著一個選項引數。-s用于--summarize改變累積和輸出。
有時您只需要一個特定的帳戶。你總是可以通過 agrep或其他東西來傳遞結果,但是如果你可以通過添加一個引數來跳過處理 99.999% 的多 GB 檔案,我認為這是值得的,所以讓我們添加一個-afor--account選項。如果您給它一個帳戶,它將忽略其他所有內容。
在設計時,總是根據幫助螢屏來為您提供使用說明。提前考慮這些事情真的會幫助你的設計。(也許這意味著-hfor--help也是一個好主意......)
有一些關于標準格式的指南,例如這個帖子或這個 wiki。
因此,如果您向它提供一組不可接受的引數(包括無引數),或者特別是 request --help,它應該吐出一條使用訊息并退出。
這為您提供了撰寫代碼的指南。您可以在了解更多資訊時對其進行編輯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/521136.html
標籤:linux重击壳
