논리적 AND in a bash script

내 bash 스크립트에 if가 있는지 확인해야합니다. 2 개의 파일이 존재합니다. “존재하지 않으면 일치해야합니다.

내 코드 :

if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 

하지만 그렇지 않습니다.” 어떤 이유로 작동하지 않는 것 같습니다.

이 두 파일이 존재하지 않는다고 110 % 확신합니다. 오류가 발생하지 않고 if를 입력하지 않습니다.

Bash 스크립팅을 처음 사용하므로 무엇이 문제인지 잘 모르겠습니다. 잘못되었습니다.

댓글

  • 게시 된 답변 중 어떤 것도 실제로 질문을 해결하지 않는다고 생각합니다. ' . 테스트를 개별적으로 시도하면 어떻게 되나요? 각각에 대해 [[ ! -f /etc/.../... ]]; echo $?를 수행하세요.
  • 경고 : [[ -f xxx ]]는 xxx가 있고 일반 파일 (또는 일반 파일에 대한 심볼릭 링크)이면 true를 반환합니다. 그렇지 않으면 false를 반환합니다. ' 존재하지 않거나 ' 존재 여부 또는 존재하지만 일반 파일 (디렉토리, 파이프, 장치, 소켓 …)이 아닌지 알 수없는 경우 또는 ' 존재하지 않거나 ' 파일에 대한 심볼릭 링크 인 경우 ' t 존재 여부 또는 일반 파일이 아닌지 알려주십시오 … [[ -e $file ]] || [[ -L $file ]]는 존재 여부 테스트에 더 가깝습니다. ls -d -- "$file" > /dev/null 2>&1는 훨씬 더 가깝습니다. 그리고 일반적으로 이러한 종류의 테스트는 경쟁 조건으로 이어집니다. ' 다른 방법이있을 수 있습니다.

답변

둘 중 하나를 원하는 경우 iv id = “1c6e578ed1이 아닌 OR를 원하는 경우 “>

.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 
  • 하나 또는 두 파일이 모두 누락 된 경우 일치합니다.
  • 코드가 둘 다 가없는 경우에만 match를 인쇄합니다.

하지만 다음과 같이 말했습니다.

이 두 파일이 존재하지 않는다고 110 % 확신합니다. 오류가 발생하지 않고 if 만 입력하지 않습니다.

그러므로 귀하의 진술이 모순됩니다. 이러한 파일 중 하나 이상이 존재해야합니다 . 해당 코드를 실행합니다.

if 문이 어떻게 평가되는지 확인하려면 -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 $ 

댓글

  • 다음의 경우 " 일치 "를 반향하고 싶습니다. 두 파일이 존재하지 않으면 일치하지 않습니다. -x로 시도해 볼 것입니다.
  • 이 경우 원본 코드는 괜찮을 것입니다. 그리고 실제로 저에게 효과적입니다.

답변

이렇게해야하지 않습니까? A는 파일이거나 B는 파일이고 blabla입니다.

if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; then echo "match" fi 

Answer

이것은 당신이하려는 일에도 효과가 있습니다. 단일 대괄호는 오늘날 bash에서 일반적으로 사용되지 않지만 여전히 옵션입니다. “-o”를 사용하는 것은 사실상 “OR”연산이고 “!” 조건을 무효화합니다.

var=/etc/benchmarking/code [ ! -f ${var} -o -f {var}.class ] && echo "match" 

댓글

  • 금지 ' bash에서 [를 사용하지 마십시오. 그 외에도이 질문에 대한 답을 알 수 없습니다.
  • [ ! -f ${var} -a ! -f {var}.class ] && echo "match" 그래야합니다. 퀘스트는 다음과 같습니다. 둘 다 존재하지 않는 경우 ' echo match

답변

코드가 요구 사항을 충족합니다. 두 파일 중 하나를 찾을 수없는 경우 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" 

일반적으로 디버깅 메시지는 stderr stdout 으로의 데이터 흐름을 방해하지 않기 위해 여기에서는 당신이 초보자라고 말했기 때문에 피했습니다. 다음은 stdout 에 쓰는 방법을 보여주는 한 가지 예입니다. em> :

echo "@ About to enter if...fi block" >&2 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다