我正在用 bash 操作陣列。我有一個包含空格的字串陣列。我想要一個包含除輸入陣列第一個元素之外的所有元素的陣列。
input=("first string" "second string" "third string")
echo ${#input[@]}
# len(input)=3
# get slice of all except for first element of input
slice=${input[@]:1}
echo ${#slice[@]}
# expect 2, but get 1
echo $slice
# second string third string
# slice should contain ("second string" "third string"), but instead is "second string third string"
對陣列進行切片顯然可以消除第一個元素,但結果似乎是所有剩余字串的串聯,而不是陣列。有沒有辦法在 bash 中對陣列進行切片并得到一個陣列?
(抱歉,我對 bash 并不陌生,但我以前從未使用過它,而且我找不到任何檔案說明為什么我的切片被壓扁了)
uj5u.com熱心網友回復:
首先,你應該總是參考變數擴展。要非常警惕,它依賴于不帶引號的擴張任何解決方案。ShellCheck.net 是一個很好的工具,用于捕捉與參考相關的錯誤(以及許多其他問題)。
對你的具體問題,slice=${input[@]:1}不做你想做的。它定義了單個標量變數slice而不是陣列,這意味著陣列擴展(由 表示[@])將首先使用當前的IFS. 這是一個演示:
$ arr=(1 2 '3 4')
$ IFS=,
$ var="${arr[@]:1}"
$ echo "$var"
2,3 4
要宣告并填充陣列,請使用=()符號,如下所示:
$ var=("${arr[@]:1}")
$ printf '%s\n' "${var[@]}"
2
3 4
uj5u.com熱心網友回復:
索引被重置,元素 1 現在是元素 0:
slice=("${input[@]:1}")
元素和索引被洗掉,第一個元素現在是索引 1,而不是索引 0:
unset input[0]
${#slice[@]}or${#input[@]}現在將比 的先前值小 1 ${#input[@]}。從 in 的三個元素開始slice,"${!slice[@]}"and的值"${!input[@]}"將分別是0 1and 1 2(對于第一種或第二種方法)
如果您不參考slice=("${input[@]:1}"),則每個陣列元素都會在空白處拆分,從而創建更多元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/361173.html
