입력이 '예'이면 스크립트를 다시 실행합니다.

입력이 '예'이면 스크립트를 다시 실행합니다.

저는 간단한 파일 처리 스크립트를 작성 중인데 끝 부분을 제외하고는 잘 작동합니다. 제가 말하려는 것은 do you want to perform another action대답이 '예'라면 yes스크립트가 다시 시작되기를 원한다는 것입니다. 일종의 루프가 필요하다는 것을 알고 있습니까? 이것이 내가 가진 것입니다:

#/bin/bash


echo "Select an option from copy , remove , rename , linking"
#read in user input into the action variable

read action

# if action is copy then continue proceed with the following
if [ $action = "copy" ]
then
echo "Please enter the filename you wish to copy"
read filename
# check if filename exists, if it doesn't then exit program
    if [ ! -e  $filename ] 
    then
    echo "$filename does not exist"
    exit 1
    fi
echo "Please enter the new filename"
read filenamenew
cp $filename $filenamenew
echo "$filename has been copied to $filenamenew"

# if action is remove then continue proceed with the following
elif [ $action = "remove" ]
then
echo "Please enter the filename you wish to remove"
read filename
# check if filename exists, if it doesn't then exit program
    if [ ! -e  $filename ] 
    then
    echo "$filename does not exist"
    exit 1
    fi
rm -rf $filename
echo "$filename has been deleted"

# if action is rename then continue proceed with the following
elif [ $action = "rename" ]
then
echo "Please enter the filename you wish to rename"
read filename
# check if filename exists, if it doesn't then exit program
    if [ ! -e  $filename ] 
    then
    echo "$filename does not exist"
    exit 1
    fi
echo "Please enter the new filename"
read filenamenew
mv $filename $filenamenew
echo "$filename has been renamed to $filenamenew"
fi

echo "Do you want to perform another file operation (yes/no) ?"
read answer

if [ $answer = yes ]
then "run script again"
exit 0
    elif [ $answer = no ]
    then echo "Exiting Program"
    exit 0
    fi
fi

답변1

echo "작업을 선택하세요..." 전에

answer=yes
while [ "$answer" = yes ]
do

마지막으로 교체

if [ $answer = yes ]
then "run script again"
exit 0
    elif [ $answer = no ]
    then echo "Exiting Program"
    exit 0
    fi
fi

통과

if [ "$answer" = yes ]
then "run script again"
fi

done

echo "Exiting Program"
exit 0

내가 한 일은 프로그램을 while [$condition ] do ; ... done.

answer=yes첫 번째 루프의 조건이 OK()인지 확인합니다.

답변2

루프에 대한 답변은 이 문제를 해결하는 좋은 방법입니다. 하지만 참고로 스크립트 자체를 다시 호출하는 데에는 아무런 문제가 없으므로 /usr/local/bin/myscript다음을 읽어보세요.

#!/bin/sh
...
if [ yes = "$answer" ]; then
  /usr/local/bin/myscript
fi

다른 경우에는 자동으로 발생하므로 그럴 필요가 없습니다 exit 0. 또한 스크립트 끝의 작업 디렉터리가 시작 부분의 작업 디렉터리와 동일하다는 것을 알고 있는 경우 스크립트 경로를 하드코딩하지 않고 $0.

이 마지막 개선이 중요합니다. 작성된 대로, 시작된 첫 번째 스크립트 프로세스는 두 번째 스크립트 프로세스를 생성하고 완료될 때까지 기다린 다음 두 번째 스크립트 프로세스가 세 번째 스크립트 프로세스를 생성하고 완료될 때까지 기다릴 수 있습니다. 이는 리소스를 소비하며 이러한 스크립트의 하위 항목이 종료되면 이러한 스크립트는 실제로 수행할 작업이 없습니다. 따라서 "테일 호출"과 동등한 프로그래밍을 사용하여 실행하는 것이 더 좋습니다. 이는 다음 명령을 사용하여 수행됩니다 exec.

#!/bin/sh
...
if [ yes = "$answer" ]; then
  exec /usr/local/bin/myscript # or exec $0
fi

두 번째 프로세스가 시작될 때 첫 번째 프로세스가 종료되고, 두 번째 프로세스가 완료될 때 세 번째 프로세스가 생성되지 않으면 첫 번째 프로세스를 시작한 사람에게 바로 돌아가는 점만 제외하면 이전과 같습니다. 아마도 셸일 것입니다.

답변3

스크립트를 함수로 래핑하고 재귀적으로 호출해 보세요.

#/bin/bash
do_file_action(){
  echo "Select an option from copy , remove , rename , linking"
  #read in user input into the action variable

  read action

  ...

  echo "Do you want to perform another file operation (yes/no) ?"
  read answer

  if [ $answer = yes ]
  then do_file_action
  exit 0
      elif [ $answer = no ]
      then echo "Exiting Program"
      exit 0
      fi
  fi
}

do_file_action

관련 정보