기존 프로그램을 디버깅하려고 하는데 if 조건 앞에 $ 기호가 붙지 않은 것을 발견했습니다.
값은 다음과 같습니다.
dt_val=1234
prev_dt_val=1234
조건이 다음과 같은 경우:
if [ dt_val -eq prev_dt_val ]
then
echo "Equal"
else
echo "Not equal"
fi
Result:
Equal
$ 기호 없이 조건문이 어떻게 제대로 작동하는지 설명할 수 있나요?
그렇지 않습니까...?
[ $dt_val -eq $prev_dt_val ]
문자열 값을 비교할 때 동일한 조건이 실패합니다. 이것은 이 조건에 숫자로 $ 기호가 필요하지 않다는 것을 의미합니까?
추가 정보:
제안된 대로 문자열을 ==와 비교합니다.
dt_val="abcd"
prev_dt_val="abcd"
if [ dt_val == prev_dt_val ]
> then
> echo Equal
> else
> echo Not equal
> fi
Not equal
쉘 정보:
echo $SHELL
/usr/bin/ksh
Version M-11/16/88f
왜 오류가 없는지 궁금합니다.
답변1
에서 내장 함수는 Bash가 and 에 대해 하는 것처럼 ksh
산술 컨텍스트에서 [
as 의 피연산자를 사용합니다 . 산술적 맥락에서 변수에는 부호가 필요하지 않습니다 .-eq
[[
-eq
$
$ ksh -c 'a=1 b=1; if [ a -eq b ]; then echo equal; else echo different; fi'
equal
$ ksh -c 'a=1 b=2; if [ a -eq b ]; then echo equal; else echo different; fi'
different
심지어:
$ ksh -c 'a=2 b=8; if [ a*4 -eq b ]; then echo equal; else echo different; fi'
equal
$ ksh -c 'a=2 b=9; if [ a*4 -eq b ]; then echo equal; else echo different; fi'
different
(단, *
여전히 와일드카드이므로 a*4
거기에 인용해야 합니다.)
ksh --version
표시된 것은 sh (AT&T Research) 93u+ 2012-08-01
Debian의 패키지( ksh
패키지 버전 )인 ksh93입니다 93u+20120801-3.1
. Debian에서도 동일한 결과를 얻었 mksh
으므로 여기에서는 ksh88이 충분히 가깝다고 생각합니다.
비교를 위해 Bash에서는 다음 오류가 발생합니다.
$ bash -c 'a=1 b=1; if [ a -eq b ]; then echo equal; else echo different; fi'
bash: line 0: [: a: integer expression expected
different
( 에러시 false 값이 반환되어 different
인쇄 됩니다 .)[
그것 으로 [[
작동합니다 :
$ bash -c 'a=1 b=1; if [[ a -eq b ]]; then echo equal; else echo different; fi'
equal
Zsh는 여기서 Bash와 같으며 [
버그가 있고 a -eq b
작동 [[
합니다.
답변2
$
첫째, 스크립트는 여러분이 찾은 것처럼 앞에 변수 이름이 없기 때문에 변수를 평가하지 않습니다 .
-eq
둘째, test
( ) 명령 [
에 숫자 비교 연산자를 사용하기 때문에 "Equal"을 출력합니다. 숫자가 아닌 두 개의 문자열이 인수로 전달되므로 둘 다 동일한 숫자 값으로 평가되므로 "Equal" 문자열이 출력됩니다.
적어도 bash 버전은 다음과 같이 불평합니다.
$ if [ 0 -eq bla ]; then echo yes; fi
-bash: [: bla: integer expression expected
내 대시 버전도 다음과 같이 불평합니다.
$ if [ 0 -eq bla ]; then echo yes; fi
dash: 1: [: Illegal number: bla
내가 관심 있는 것은 불평하지 않는 쉘을 사용하는 것입니다.
이 문자열의 이름에 대한 변수가 있더라도 동일한 결과를 얻습니다.