"if" 문에서 명령을 실행하고 성공 시 추가 단계를 수행합니다.

"if" 문에서 명령을 실행하고 성공 시 추가 단계를 수행합니다.

프롬프트에서 제공된 전체 경로를 기반으로 디렉토리를 생성하는 프로그램을 실행하려고 하는데 디렉토리가 이미 존재하는 경우 오류("디렉토리가 이미 존재합니다.")를 반환하고 재귀 함수.

내가 시도한 것은 다음과 같습니다. test1다음과 같은 파일이 있다고 가정해 보겠습니다.

#!/bin/bash
echo "enter the directory name"
read ab
check(){
if (( echo `mkdir $ab` 2>/dev/null )); then
  echo "directory created "
  echo `ls -ld $ab`
  exit
else
  echo "try again "
  echo "enter new value for directory:"
  read ab
  check
fi
}
check

여기서 문제는 디렉토리가 존재하면 프로그램이 제대로 작동하지만 존재하지 않으면 디렉토리를 생성한 다음 프로그램의 다른 부분으로 이동한다는 것입니다.

답변1

에코는 항상 성공합니다. 그것과 서브쉘이 없으면:

#!/bin/bash
echo "enter the directory name"
read ab
check(){
    if mkdir "$ab" 2>/dev/null; then
      echo "directory created "
      ls -ld "$ab"
      exit
    else
      echo "try again "
      echo "enter new value for directory: "
      read ab
      check
    fi
}
check

답변2

(( echo `mkdir $ab` 2>/dev/null ))
bash: ((: echo  2>/dev/null : syntax error in expression (error token is "2>/dev/null ")

이중 괄호산술 표현. 이 명령은 예상한 것과 비슷한 작업을 수행하지 않습니다. mkdir $ab표준 출력에는 아무 것도 기록되지 않으므로 `mkdir $ab`빈 문자열이므로 산술 표현식의 내용이 됩니다 echo 2>/dev/null. 여기서 기호 는 변수 이름인 >"보다 큼" 연산자입니다 . echo산술 표현식의 구문이 올바르지 않습니다(변수 뒤에 리터럴 정수가 올 수 없음). 명령의 구문이 올바르지 않기 때문에 오류 상태를 반환하고 else분기를 사용합니다.

명령의 반환 상태를 테스트하려면 명령을 작성하면 됩니다.

if mkdir -- "$ab" 2>/dev/null

추가 팁:

  • 명령에서 오류를 숨기는 것은 좋은 생각이 아닙니다. 사용자는 오류가 권한 거부, I/O 오류 등인지 알아야 합니다. 존재하지 않는 경우 디렉토리를 생성하고 이미 존재하는 경우 성공하려면 를 사용하십시오 mkdir -p -- "$ab".
  • 변수 대체에는 항상 큰따옴표를 사용하십시오..
  • 값이 ab대시로 시작하면 옵션으로 해석됩니다. --표시된 옵션의 끝 부분을 먼저 배치하십시오.

답변3

tries=0
while [ "$((tries+=1))" -le 5 ]    || ! break
      printf 'enter dirname: > '
      IFS=   read -r dir    && 
      if   ! mkdir -- "$dir"
      then   echo try again
      else ! echo Success\!
      fi  
do :; done

왜 이와 같은 종료 상태를 무효화하려는지 잘 모르겠지만 위의 내용은 찾고 있는 반전과 비슷한 것을 얻어야 하며 제한된 수에서 작동해야 한다고 생각합니다 $tries.

실행하면...?

enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again

그리고 또...

enter dirname: > doesntexist
Success!

답변4

이 아이디어는 상황을 약간 더 복잡하게 만들지만 스크립트에서 적절한 테스트를 활용하는 것이 더 올바른 접근 방식이라고 제안합니다. 일부 효과:

#!/bin/bash
if [[ -n $1 ]]; then
  dirname=$1
fi

if [[ -z $dirname ]]; then
  echo "Enter directory name."
  read dirname
fi

check() {
  if [[ -d "$dirname" ]]; then
    echo "Directory already exists."
    echo "Enter new directory name."
    read dirname
    check
  elif [[ -e "$dirname" ]]; then
    echo "$dirname already exists, but is not a directory."
    echo "Enter new directory name."
    read dirname
    check
  else
    if mkdir -p -- "$dirname"; then
      echo "Directory created"
      ls -ld "$dirname"
    fi
    exit
  fi
}
check

이렇게 하면 호출(mkdir)의 오류 메시지가 보존되고 몇 가지 유용한 테스트를 수행하여 시도가 실패한 이유에 대한 피드백을 제공합니다. 또한 선택적으로 원하는 디렉터리 이름을 명령줄 인수로 전달할 수 있으며 두 번째 시도에서만 입력하라는 메시지가 표시됩니다.

관련 정보