bash: == 및 `bc` 출력 유형을 사용하는 -eq

bash: == 및 `bc` 출력 유형을 사용하는 -eq

이 코드는 존재하지 않는 함수를 (적당하게) 시뮬레이션하는 더 큰 스크립트에서 가져온 것입니다 abs().

[[ $(echo "$val < 0" | bc) -eq 1 ]] && val=$(echo "$val * -1" | bc)

따라서 숫자가 음수인지 테스트합니다. 그렇다면 &&다음 두 번째 명령문이 실행됩니다. 이것이 내 원래 라인입니다.

다른 SE 사용자 중 일부는 나중에 다음과 같이 변경했습니다.

(( $(bc <<<"$val < 0") == 1 )) && val=$(bc <<<"$val * -1")

글쎄, 이 두 가지 모두 분명히 작동하지만 연산자 -eq(구현됨) 만 사용하는 것이 아니기 때문에 나는 여전히 내 것을 선호합니다.특히문자열이 아닌 경우), 여기에 문자열도 피하므로 읽기 전용 환경에서 코드가 더 잘 작동합니다. ( /tmp이 문자열이 작동하려면 문자열에 쓰기 가능해야 한다는 점을 기억하십시오.)

bc마지막으로, 다음 줄에서는 실제 정수가 출력될 것이라는 점을 기억하는 것 같습니다 ==. 이는 문자열에만 권장되기 때문에 사용법이 다소 문제가 됩니다. 안타깝게도 해당 페이지 에서는 결과를 순수한 숫자로 출력하는지, 아니면 문자열로 출력하는지 bc공개하지 않습니다 .man

의견?

답변1

당신은 여기서 혼란스러워합니다.

[[ $(echo "$val < 0" | bc) -eq 1 ]]둘 다 (( $(bc <<<"$val < 0") == 1 ))정수 비교를 사용합니다.

((..)), 및 의 let내장 기능 과 동일합니다 .kshbashzsh산술 표현. 에서는 ((..))모든 연산자와 우선순위, 연관성, 값이 C와 동일합니다.

혼란스러울 수 있는 것은 ==새로운 테스트 연산자의 내부 입니다 [[...]]. 사용 가능한 경우 패턴 일치 ==와 동일하며 이를 =수행합니다. 문자열 비교를 위해서는 양쪽에 큰따옴표를 넣어야 합니다 [[ "$a" == "$b" ]].

관련 정보