저는 간단한 파일 처리 스크립트를 작성 중인데 끝 부분을 제외하고는 잘 작동합니다. 제가 말하려는 것은 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