![bash 배열의 요소를 곱하고 배열 요소를 새 값으로 설정](https://linux55.com/image/184737/bash%20%EB%B0%B0%EC%97%B4%EC%9D%98%20%EC%9A%94%EC%86%8C%EB%A5%BC%20%EA%B3%B1%ED%95%98%EA%B3%A0%20%EB%B0%B0%EC%97%B4%20%EC%9A%94%EC%86%8C%EB%A5%BC%20%EC%83%88%20%EA%B0%92%EC%9C%BC%EB%A1%9C%20%EC%84%A4%EC%A0%95.png)
Bash에서 배열의 요소에 a가 포함된 것으로 발견되면 K
해당 요소에 1000을 곱하고 해당 요소를 제품으로 설정하고 싶습니다.
for i in "${stats_array[@]}"
do
if echo "$i" | grep -q K; then
# set that value to that value times 1000
fi
done
Bash 스크립트에서는 어떻게 수행됩니까?
내 배열은 다음과 같습니다.
stats_array: 1, 54, 54K, 99
나는 그것이 다음과 같이 보이기를 원합니다 :
stats_array: 1, 54, 54000, 99
답변1
$ { IFS=, ; arr=( 1,54,54K,99k ); }
$ printf '%s\n' ${arr[@]}
1
54
54K
99k
## note: enable extended pattern matching for [...] with 'shopt -s extglob'
$ rearr=( "${arr[@]//%[Kk]/000}" )
$ printf '%s\n' ${rearr[@]}
1
54
54000
99000
## or write the changes to same array
$ arr=( "${arr[@]//%[Kk]/000}" )
답변2
반복색인값 배열이므로 새 값을 설정하기가 쉽습니다.
이는 전역 스키마에서 분기하는 데 사용됩니다 case
. 이를 확장하는 것이 쉽다는 것을 알 수 있습니다 M
.G
stats_array=( 1 54 54K 99 )
for idx in "${!stats_array[@]}"; do
value=${stats_array[idx]};
case $value in
*K) stats_array[idx]=$(( ${value%K} * 10**3 )) ;;
esac
done
declare -p stats_array
declare -a stats_array=([0]="1" [1]="54" [2]="54000" [3]="99")
Bash 산술은 부동 소수점 숫자를 처리할 수 없으므로 53.9K
이를 다음과 같이 변환할 것으로 기대할 수 없습니다.53900