bash 배열의 요소를 곱하고 배열 요소를 새 값으로 설정

bash 배열의 요소를 곱하고 배열 요소를 새 값으로 설정

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}" )

또한보십시오:Bash에서 배열에 요소를 추가/제거하는 방법은 무엇입니까?

답변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

관련 정보