내 bash 스크립트 중 하나는 if
이 두 파일 중 하나가 존재하는지 확인해야 하며, 존재하지 않으면 일치 항목을 다시 표시해야 합니다.
코드가 있습니다.
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
echo "match"
fi
그러나 이것은 어떤 이유에서인지 작동하지 않는 것 같습니다.
나는 이 두 파일이 존재하지 않는다고 110% 확신합니다. 오류가 발생하지 않고 if
.
저는 bash 스크립팅을 처음 접했기 때문에 무엇이 잘못될 수 있는지 잘 모르겠습니다.
답변1
네가 원한다면누구나글쎄요, 당신이 원하는 것은 OR
아닙니다 AND
.
if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then
echo "match"
fi
- 하나 또는 두 파일이 모두 누락된 경우 일치합니다.
match
귀하의 코드는 다음과 같은 경우에만 코드를 인쇄합니다.둘 다존재하지 않는다.
하지만, 당신은 이렇게 말합니다:
나는 이 두 파일이 존재하지 않는다고 110% 확신합니다. 오류가 발생하지 않으며 if를 입력하지 않습니다.
그래서 당신의 진술은 모순됩니다. 파일 중 적어도 하나~ 해야 하다존재하다,만약에당신은 달리고 있다저것암호.
if
명령문이 어떻게 평가되는지 보려면 run it 을 사용하십시오 -x
.
#!/bin/bash -x
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
echo "match"
fi
그러면 실행 과정을 볼 수 있습니다.
$ ./test.sh
+ [[ ! -f /etc/benchmarking/code ]]
+ [[ ! -f /etc/benchmarking/code.class ]]
+ echo match
match
$
답변2
이렇지 않아야합니까? A는 파일이고 B는 파일이고 blabla입니다.
if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]];
then
echo "match"
fi
답변3
이는 당신이 하려는 일에도 적합할 수 있습니다. 오늘날 단일 괄호는 와 함께 덜 일반적으로 사용되지만 bash
여전히 옵션입니다. 사용은 -o
실제로 "OR" 연산이며 !
조건을 무효화합니다.
var=/etc/benchmarking/code
[ ! -f "$var" -o ! -f "$var.class" ] && echo "match"
답변4
match
코드는 원하는 작업을 수행합니다. 파일을 찾을 수 없으면 인쇄합니다.
match
그래서 인쇄하지 않는 이유는 다른 곳에 있습니다. 여러 디버그 메시지로 코드 블록을 둘러싸서 완료할 수 있는 코드 블록에 도달했는지 확인해야 합니다. 예를 들어 다음과 같습니다.
echo '@ About to enter if...fi block'
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
echo "match"
fi
echo '@ Finished if...fi block'
내가 일반적으로 선호하는 것은 디버그 메시지가표준 에러데이터 흐름이 중단되지 않도록표준 출력, 그런데 여기서는 당신이 초보자라고 했기 때문에 그것을 피했습니다. 다음은 작성 방법을 보여주는 예입니다.표준 에러:
echo '@ About to enter if...fi block' >&2