다음은 간단한 테스트 코드입니다.
#!bin/bash
cpm=(0 1 0.094)
lv=1
attack=5
defense=9
stamina=16
echo $((cpm[lv]))
mycpm=$((cpm[lv]))
#mycpm=`echo "0.094" | bc -l`
cq=`echo "$attack*$defense*1/10*sqrt($stamina)*2^2*$mycpm" | bc -l`
echo $cq
터미널 출력:
bash testing.sh
1
72.00000000000000000000
알았어, 좋아.
그런 다음 세 번째 줄을 다음으로 변경하면lv=2
bash testing.sh
testing.sh: line 7: 0.094: syntax error: invalid arithmetic operator (error token is ".094")
testing.sh: line 8: 0.094: syntax error: invalid arithmetic operator (error token is ".094")
(standard_in) 2: syntax error
그렇다면 배열에서 소수를 어떻게 사용해야 할까요? 덕덕고잉에 대해서는 아무것도 찾을 수 없습니다. 가장 가까운 것은 for 루프 배열 체인으로, 여기서 단계당 +0.1을 반복하는 방법을 알아냅니다. 그렇지 않으면 해당 튜토리얼은 모두 정수를 사용합니다. 표현식에 사용하기 위해 값을 가져와야 하는 미리 구성된 배열이 있습니다.
실제로 $mycpm을 0.094로 변경하면 라인 10이 작동합니다. 평가가 좋을 겁니다. 배열을 사용하여 이 값을 얻을 수 있다면 이것이 문제입니다.
bash에서 달성하고 싶은 것이 가능합니까?
답변1
여기서 문제는 배열이 아닙니다. 사실 bash는 정수가 아닌 숫자에 대한 산술 평가를 지원하지 않습니다. 스칼라 변수 또는 스칼라 상수에 대해서도 동일한 오류가 발생합니다.
$ bash -c 'echo $((0.094))'
bash: 0.094: syntax error: invalid arithmetic operator (error token is ".094")
일부 다른 셸, 특히 zsh, ksh93 및 yash는 이를 지원하지만 ksh93 및 yash는 고유한 방식으로 로케일의 소수점 기본 문자를 존중하며 따옴표가 없는 산술 확장은 ksh93 및 yash 모두에서 IFS 분할을 거칩니다(bash에서와 같이).
$ zsh -c 'echo $((0.094))'
0.094
$ LC_ALL=fr_FR.UTF-8 ksh93 -c 'echo "$((0.094))"'
ksh93: 0.094: radix point '.' requires LC_NUMERIC=C
$ LC_ALL=C ksh93 -c 'echo "$((0.094))"'
0.0939999999999999858
$ LC_ALL=fr_FR.UTF-8 ksh93 -c 'echo "$((0,094))"'
0,0939999999999999858
$ LC_ALL=fr yash -c 'echo "$((0.094))"'
0.094
$ LC_ALL=fr_FR.UTF-8 yash -c 'echo "$((0.094))"'
0,094
그래도 그럴 필요도 없지노력하다쉘에서 표현식을 평가하려면 표현식을 그대로 두고 bc
평가되지 않은 값을 할당 하면 됩니다.매개변수 확장 ${cpm[lv]}
변수에:
#!/bin/bash
cpm=(0 1 0.094)
lv=2
attack=5
defense=9
stamina=16
echo "${cpm[lv]}"
mycpm=${cpm[lv]}
#mycpm=$(echo "0.094" | bc -l)
cq=$(echo "$attack*$defense*1/10*sqrt($stamina)*2^2*$mycpm" | bc -l)
echo "$cq"
그 다음에
$ ./testing.sh
0.094
6.76800000000000000000
또한 더 이상 사용되지 않는 "backtick"을 최신 $(명령 대체)로 바꾸고 따옴표를 추가했습니다.