내 문제를 설명하는 간단한 bash를 찾았습니다.
#!/bin/sh
str1="Learn Bash"
str2="Learn Bash"
if (( "$str1" == "$str2" )); then
echo "Both Strings are Equal."
else
echo "Both Strings are not Equal."
fi
결과 :
if_equal.sh: 6: if_equal.sh: Learn Bash: not found
Both Strings are not Equal.
기본적으로 나는 awk의 결과를 float와 한 번 비교한 다음 사용자가 제공한 정수와 비교하기를 원하므로 언제 사용할 수 있습니까?
[ "$c" -gt "$o" ]
하지만 부동 소수점에서는 작동하지 않으며 다음과 같이 세 번째 변수를 사용하여 반복할 수도 없습니다.
[ "$c" -gt "$o" ] && echo fine || [ "$b" -gt "$o" ] && echo better
모든 공백을 확인하고 ", [], (), (())를 사용하거나 사용하지 않고 시도했습니다. if에서 첫 번째 변수가 누락된 것을 발견한 이유를 찾을 수 없습니다. BTW, 내 스크립트는 파일을 생성합니다. 내가 실행하면서 "0.9500"
if (( "$c" > "0.9500" ))
어쩌면 해결책이 있을까요?
답변1
, 산술 평가 bash
입니다 . -line 때문에 스크립트가 사용하는 셸인 셸 (( ... ))
에서는 두 개의 중첩된 하위 셸로 해석될 가능성이 높습니다. 이것이 쉘을 사용하여 실행할 때 파일이 호출되는 이유입니다. 이는 비교 연산자가 아닌 I/O 리디렉션이며 명령으로 해석되므로 "찾을 수 없음" 오류 메시지가 발생합니다.sh
#!
0.9500
(( "$c" > "0.9500" ))
sh
>
$c
셸 에서 sh
문자열을 비교하려면 다음을 사용하세요.
[ "$str1" = "$str2" ]
정수를 비교하려면 다음을 사용하십시오.
[ "$num1" -gt "$num2" ]
셸 에서는 bash
위 구문을 사용할 수도 있지만 다음을 사용할 수도 있습니다.
[[ "$str1" == "$str2" ]]
두 문자열이 같은지 비교하고
(( num1 > num2 ))
두 정수를 비교합니다.
쉘에는 bash
문자열 이외의 다른 방식으로 부동 소수점 숫자를 처리하는 기능이 없습니다.
쉘에서 부동 소수점 숫자를 비교하려면 awk
.
if awk -v num1="$num1" -v num2="$num2" 'BEGIN { exit !(num1 > num2) }'
then
printf '%s is greater than %s\n' "$num1" "$num2"
else
printf '%s is not greater than %s\n' "$num1" "$num2"
fi
비교의 부울 결과를 !
셸의 종료 상태로 변환하려면 반전해야 합니다.
관련된:
답변2
첫째, sh
그것을 다루지 마십시오 (( … ))
. 를 사용할 수 있지만 bash
이 경우에도 숫자 정수 표현식에서만 작동합니다. 이 답변의 뒷부분에서 sh
호환되는 사용법을 참조하십시오 awk
. 나는 당신이 스크립트를 스크립트로 설명했지만 그것을 제목 bash
으로 사용했다는 것을 알았습니다. #!/bin/sh
이 헤더는 스크립트를 sh
약간 다른 구문을 사용하여 스크립트로 선언합니다.
당신이 사용하는 경우bash
man bash
문서()에서 검색 해야 합니다 (즉 , 호출기에 필요한 경우 ((
대괄호를 이스케이프해야 할 수도 있습니다 ). \(\(
이 텍스트를 찾을 수 있습니다.
((expression))
표현식은 아래 설명된 규칙에 따라 평가됩니다.산술 평가.
아래로 검색 ARITHMETIC EVALUATION
하면 이 글을 읽게 될 것입니다(필자의 강조).
산술 평가쉘을 사용하면 특정 상황에서 산술 표현식을 평가할 수 있습니다(
let
내장declare
명령,((
복합 명령 및 산술 확장 참조).평가는 고정 너비 정수로 수행되며 오버플로 검사는 없습니다.[...]
이것이 말해주는 것은 (( … ))
구성이 평가할 수 있다는 것입니다.정수 연산. 문자열이나 부동 소수점 연산에서는 작동하지 않습니다.
이제 계속해서 sh
또는 bash
.
[ … ]
문자열을 사용하거나 처리 할 수 있습니다 [[ … ]]
.
if [[ "$str1" == "$str2" ]] … # bash
또는
if [ "$str1" = "$str2" ] … # POSIX including sh, and bash
부동 소수점 연산은 더 어렵습니다. 종료하거나 bc
이 awk
작업을 수행해야 합니다(제가 선호하는 방법은 입니다 awk
).
a=12.34 b=5.678 # These are strings
# You cannot compare them as integers, because they're floats
if [[ "$a" -gt "$b" ]]; then echo yes; else echo no; fi
-bash: [[: 12.34: syntax error: invalid arithmetic operator (error token is ".34")
# You can use awk though
if awk -v a="$a" -v b="$b" 'BEGIN { exit !(a > b) }'; then echo yes; else echo no; fi
yes
awk
여기서는 두 개의 변수 a
sum 을 할당합니다 b
. awk
읽기를 시작하기 전에표준 입력이를 숫자와 비교하고 >
/에 해당하는 상태로 종료됩니다. 이 종료 상태는 쉘 구성에 의해 평소와 같이 처리됩니다.true
false
awk
if … then … else … fi