我有一個腳本,用戶可以在其中添加任意數量的引數(數字)。
該腳本將對最后一個數字旁邊的所有數字求和 - 最后一個數字(引數)是我需要除以的數字
例如:
./test.sh 2 2 6 5
這將對前 3 個數字 (2 2 6) 求和并將答案除以 5(最后一個引數)
- 我怎樣才能使用最后一個引數?回聲???
- 除了最后一個引數之外,我如何移動回圈第一個引數 - 我希望所有 3 個引數都將添加到一個陣列中,并且我可以回圈它
- 請注意,可以更改引數的數量
uj5u.com熱心網友回復:
我怎樣才能使用最后一個引數?回聲???
當然$# > 0,您可以使用"${!#}".
除了最后一個引數之外,我如何移動回圈第一個引數 - 我希望所有 3 個引數都將添加到一個陣列中,并且我可以回圈它
再次授予$# > 0,您可以參考"${@:1:$# - 1}"。
閱讀 bash 手冊中的陣列部分以了解如何正確擴展陣列。
我還建議學習參考的作業原理并了解不需要的分詞和通配符的危險。
uj5u.com熱心網友回復:
很快(帶有bashisms)
由于這個問題被標記 整數算術 和 猛擊:
這是一個小而有效的腳本:
#!/bin/bash
addVals=${*: 1 : $# - 1}
declare -i intResult=" ( ${addVals// / } ) / ${@: -1} "
echo $intResult
但是沒有回圈...
長答案
我怎樣才能使用最后一個引數?回聲???
您可以在命令列中進行嘗試:
set -- 2 2 6 5
然后
echo $@
2 2 6 5
echo ${*: 3}
6 5
echo ${*: -1}
5
echo ${*: 1 : -1}
bash: -1: substring expression < 0
echo $#
4
echo ${*: 1 : $# -1}
2 2 6
那好吧
someVar=${*: 1 : $# -1}
echo ${someVar// /:SpaceReplacment:}
2:SpaceReplacment:2:SpaceReplacment:6
所以
declare -i result
result=" ( ${someVar// / } ) / ${*: -1} "
echo $result
2
除了最后一個引數之外,我如何移動回圈第一個引數 - 我希望所有 3 個引數都將添加到一個陣列中,并且我可以回圈它
繼續前進,在命令列下......
someArray=("${@: 1: $# -1 }")
使用declare -p顯示$someArray的內容:
declare -p someArray
declare -a someArray=([0]="2" [1]="2" [2]="6")
然后
declare -i mySum=0
for i in "${someArray[@]}";do
mySum =i
done
echo $mySum
10
echo $(( mySum / ${*: -1} ))
2
請注意,可以更改引數的數量
請注意:
使用雙引號允許處理包含空格的字串:
set -- foo bar 'foo bar baz' echo ${2} bar echo ${*: $# } foo bar baz“$@”(陣列到陣列)和“$*”(陣列到字串)的使用區別
set -- foo bar 'foo bar' 'foo bar baz'如果我取 3 個第一個元素:
someArray=("${@: 1: $# -1 }") declare -p someArray declare -a someArray=([0]="foo" [1]="bar" [2]="foo bar")但
someArray=("${*: 1: $# -1 }") declare -p someArray declare -a someArray=([0]="foo bar foo bar")
uj5u.com熱心網友回復:
有大約一千種方法可以做到這一點。如果您想使用整數運算,您可以在 bash 中執行以下操作
一個簡短的半隱秘版本是:
IFS=
echo $(( ( ${*} - ${#:-1} ) / ${#:-1} ))
在這里,我們利用之間的差異"${*}",并"${#}"通過設定執行的總和IFS= (見之間有什么區別“$ @”和“$ *”在Bash的?)
一個長期的經典方法是:
for i in "$@"; do ((s =i)); done
echo $(( (s-${@:-1})/${@:-1} ))
對所有項求和并在之后減去最后一項更容易
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/393522.html
