이 코드는 존재하지 않는 함수를 (적당하게) 시뮬레이션하는 더 큰 스크립트에서 가져온 것입니다 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
내장 기능 과 동일합니다 .ksh
bash
zsh
산술 표현. 에서는 ((..))
모든 연산자와 우선순위, 연관성, 값이 C와 동일합니다.
혼란스러울 수 있는 것은 ==
새로운 테스트 연산자의 내부 입니다 [[...]]
. 사용 가능한 경우 패턴 일치 ==
와 동일하며 이를 =
수행합니다. 문자열 비교를 위해서는 양쪽에 큰따옴표를 넣어야 합니다 [[ "$a" == "$b" ]]
.