我想迭代 bash 中的成對元素。在 Python 中,這是直截了當的:
x_list = [1, 2, 3, 4]
y_list = ["a", "b", "c", "d"]
for x, y in zip(x_list , y_list):
# here we have access to the values (i.e. the pairs are assigned to variables):
result = do_something(x, y)
print(result)
如何在 bash 中復制這種行為?我需要將這些對的值存盤到 for 回圈內的變數中,以便我可以執行一些操作。它應該是這樣的:
for x, y in 1a 2b 3c 4d
do
python script.py --x_value=${x} --y_value=${y}
done
請注意,串列的元素也可能是復雜的東西,例如:
x_list = [1e-5, 1e-4, 1e-3]和y_list = [10, 20, 30]
uj5u.com熱心網友回復:
您的代碼的可能翻譯是:
#!/bin/bash
list0=(1 2 3 4)
list1=(a b c d)
for i in "${!list0[@]}"
do
x=${list0[i]}
y=${list1[i]}
printf '%q %q\n' "$x" "$y"
done
1 a
2 b
3 c
4 d
但它依賴于兩個新創建的陣列將具有相同索引的事實。這是問題的說明:
#!/bin/bash
list0=(1 2 3 4)
list1=(a b c d)
unset list0[0] list1[1]
for i in "${!list0[@]}"
do
x=${list0[i]}
y=${list1[i]}
printf '%q %q\n' "$x" "$y"
done
2 ''
3 c
4 d
uj5u.com熱心網友回復:
這是使用關聯陣列的選項
x_list=(1 2 3 "1e-5" 999)
y_list=("a" "b" "c" "d")
declare -A arr
max=$(( ${#x_list[@]} - 1 ))
# use the smallest size
echo "Sizes: x_list: ${#x_list[@]} y_list: ${#y_list[@]} max: $max"
if [ "${#x_list[@]}" -gt "${#y_list[@]}" ];then
max=$(( ${#y_list[@]} - 1 ))
fi
for i in $(seq 0 $max);do
arr[${x_list[$i]}]=${y_list[$i]}
echo "${x_list[$i]} -> ${y_list[$i]}; ${arr[${x_list[$i]}]}"
done
結果
Sizes: x_list: 5 y_list: 4 max: 4
1 -> a; a
2 -> b; b
3 -> c; c
1e-5 -> d; d
遍歷鍵
for key in "${!arr[@]}"; do
echo "key=$key, value=${arr[$key]}"
done
結果:
key=1, value=a
key=2, value=b
key=3, value=c
key=1e-5, value=d
uj5u.com熱心網友回復:
如果您有兩個非稀疏陣列,那么Fravadona 答案中的代碼是一個不錯的選擇。如果至少有一個陣列是稀疏的,那么這個Shellcheck -clean 代碼是一種方法:
#! /bin/bash -p
x_list=([0]=1 [2]=2 [4]=3 [6]=4)
y_list=([1]=a [3]=b [5]=c [7]=d)
for x in "${x_list[@]}"; do
IFS= read -r -d '' y
printf '%q %q\n' "$x" "$y"
done < <(printf '%s\0' "${y_list[@]}")
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446332.html
