我寫了一個函式來檢查引數是否被傳遞給腳本,所以我必須為$@函式創建一個別名變數,因為函式內部將是函式的引數。這是代碼:
script_args=$@
is_arg_passed() {
local passed=false
for passed_arg in ${script_args}; do
for arg in "$@"; do
if [[ "${passed_arg}" == "${arg}" ]]; then
passed=true
break
fi
done
[[ "${passed}" == true ]] && break
done
echo "${passed}"
}
雖然我肯定想了解如何更短地實作它,但這不是我的問題的主題(盡管一些建議將不勝感激;])。
我的問題與這for passed_arg in ${script_args}; do條線有關:
為什么script_args在字串中擴展時它不起作用,即"${script_args}",何時"${@}"或"$@"確實。只${script_args}作業。
那么$@與常規陣列(如(a b c))有何script_args不同,與 有何不同$@?問題是什么?
uj5u.com熱心網友回復:
根據您比較它們的方式,它們并沒有什么不同,因為與位置引數非常相似的陣列是用引號擴展的: "${script_args[@]}"
此外,您存盤的引數是錯誤的。隨著script_args=$@您將字串值存盤到script_args. 該值是 的值的合并形式,$@其空間用作連接符。
要將它們存盤為陣列,請使用script_name=("$@"). 閱讀Bash 手冊的陣列部分以了解更多資訊。
uj5u.com熱心網友回復:
$@ 不是陣列,盡管它是類似陣列的。
賦值script_args=$@只是創建一個常規引數,其值是$@與空格連接的內容。如果您真的想要一個具有相同內容的陣列,請使用
script_args=( "$@" ) # The quotes are critical!
is_arg_passed() {
local passed=false
for passed_arg in "${script_args[@]}"; do # So are these quotes!
for arg in "$@"; do
if [[ "${passed_arg}" == "${arg}" ]]; then
passed=true
break
fi
done
[[ "${passed}" == true ]] && break
done
echo "${passed}"
}
這種包含檢查也可以使用關聯陣列來完成(只要引數不是空字串)。
declare -A script_args
for arg; do
# The value doesn't matter; we'll only be checking
# if the key exists.
script_args["$arg"]=
done
is_arg_passed() {
for arg; do
if ! [[ -v "script_args[$arg]" ]]; then
echo false
return 1
fi
done
echo true
return 0
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/406194.html
標籤:
