Bash 스크립트를 실행하면 숫자 변수가 디렉토리에 나타납니다.

Bash 스크립트를 실행하면 숫자 변수가 디렉토리에 나타납니다.

디렉토리에 Bash 스크립트를 작성했습니다. 내가 그것을 실행하고 "ls"하면 디렉토리 레벨에 숫자가 나타나고 "rm"을 사용하여 제거해야 합니다.

이 Bash 스크립트의 목적은 현재 파일을 디렉토리에 저장하고 logstore.txt저장된 이전 줄 수를 얻은 numlines.txt다음 파일에 할당된 새 줄 수를 찾고 numlines.txt마지막으로 이전 줄과 비교할 새 줄 수를 얻는 것입니다. 번호(서버는 시간이 지남에 따라 변경됩니다) 새 파일이 계속되고(예상할 수 없는 경우) 이전 줄 길이와 새 줄 길이를 비교합니다.

이는 .sh 파일의 코드입니다.

ls /home/vcm > /home/vcm/logstore.txt
oldnumlines=$(cat /home/vcm/numlines.txt)
#log store takes the new ls of items and stores it as num lines after the old v$
cat logstore.txt | wc -l > /home/vcm/numlines.txt

newnumlines=$(cat /home/vcm/numlines.txt)

if [ ! "$newnumlines" > "$oldnumlines" ]
#[ "$a" -eq "$b" ]
#(( "$newnumlines" -le "$oldnumlines" ))
 then
   *do something*
 fi

이 스크립트가 디렉토리에 새 변수를 생성하는 이유는 무엇입니까?

답변1

이와 같은 것을 디버깅하는 방법은 다음과 같습니다. 귀하의 스크립트의 단순화된 버전이 있습니다.

$ cat var_dumper.bash
#!/bin/bash

var1=1
var2=2

if [ ! "$var1" > "$var2" ]; then
   echo "I'm inside the if/then"
fi

우리는 그것을 실행합니다:

$ ./var_dumper.bash
$ ls
var_dumper.bash  2

2그러면 파일로 표시되는 것을 볼 수 있습니다 . 그게 당신의 문제입니다.

디버그

쉘 스크립트를 디버깅하려면 항상 -xBash로 전환하여 시작합니다. 다음과 같이 스크립트를 실행할 수 있습니다.

$ bash -x ./var_dumper.bash
+ var1=1
+ var2=2
+ '[' '!' 1 ']'

이는 어디서 실패했는지 알려줍니다. 상태 if. 그렇다면 이것의 문제점은 무엇입니까? 그러면 첫 번째 단서는 입니다 >. Bash의 다른 용도에서는 리디렉션 연산자이므로 기록되는 파일이 생성될 수 있습니다.

이제 예제를 단일 실행 파일로 다시 작성해 보겠습니다.

$ var1=1 var2=2 [ "$var1" > "$var2" ] && echo success || echo failure
success

다음 단서는 성공을 반환하는 이유입니다. 1은 2보다 크지 않습니다. 그래서 우리는 그것을 구글링했고 Bash에서 정수를 비교하려면 연산자를 사용하지 않고 >실제로 다음 연산자를 사용해야 한다는 것을 발견했습니다 -gt.

$ var1=1 var2=2 [ "$var1" -gt "$var2" ] && echo success || echo failure
failure

원래는 부정되기를 원했으므로 !다시 되돌릴 수 있습니다.

$ var1=1 var2=2 [ ! "$var1" -gt "$var2" ] && echo success || echo failure
success

효과가있다. 따라서 수정된 if진술은 다음과 같습니다.

if [ ! "$var1" -gt "$var2" ]; then
   echo "I'm inside the if/then"
fi

그럼 무엇이 잘못됐나요?>

귀하의 시나리오에서는 if [ .... ]이 형식의 if/then이 POSIX 호환 버전입니다. 통신사에서는 지원하지 않습니다 >. 지원되는 형식은 다음과 같습니다. if [[ .... ]]. 이중 브래킷 버전이 더 강력합니다.확장된 테스트주문하다.

따라서 대안으로:

$ cat var_dumper.bash
#!/bin/bash

var1=1
var2=2

if [[ ! "$var1" > "$var2" ]]; then
   echo "I'm inside the if/then"
fi

또한 작동합니다:

$ bash -x var_dumper.bash
+ var1=1
+ var2=2
+ [[ ! 1 > 2 ]]
+ echo 'I'\''m inside the if/then'
I'm inside the if/then

인용하다

답변2

사용하지 마세요>디지털 테스트 중. 리디렉션 연산자이기 때문입니다.

실행은 항상 true입니다(파일이 작성된 경우).

$ if [ 2 > 30000 ]; then echo OK; else echo NO; fi
OK
$ ls
$ 30000
$ rm 30000

그리고 30,000개의 파일이 작성되었습니다.

수치 테스트는 수행되지 않았지만 파일 쓰기가 수행되어 true를 반환했습니다.

$ mkdir tmp
$ chmod -w tmp
$ cd tmp
$ if [ 2 > 30000 ]; then echo OK; else echo NO; fi
-bash: 30000: Permission non accordée
NO
$ cd ..
$ rmdir tmp

-gt를 사용하세요.

$ if [ 2 -gt 30000 ]; then echo OK; else echo NO; fi
NO
$ ls

관련 정보