![Bash 스크립트를 실행하면 숫자 변수가 디렉토리에 나타납니다.](https://linux55.com/image/136708/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%8B%A4%ED%96%89%ED%95%98%EB%A9%B4%20%EC%88%AB%EC%9E%90%20%EB%B3%80%EC%88%98%EA%B0%80%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90%20%EB%82%98%ED%83%80%EB%82%A9%EB%8B%88%EB%8B%A4..png)
디렉토리에 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
그러면 파일로 표시되는 것을 볼 수 있습니다 . 그게 당신의 문제입니다.
디버그
쉘 스크립트를 디버깅하려면 항상 -x
Bash로 전환하여 시작합니다. 다음과 같이 스크립트를 실행할 수 있습니다.
$ 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