일괄:
@echo off
:step1
if exist "file1.txt" (GOTO step2) ELSE (GOTO X)
:step2
if exist "file2.txt" (GOTO Z) ELSE (GOTO Y)
:X
run the script from the beginning and file1.txt and file2.txt are created and the rest of the script is executed
:Y
run the commands to file1.txt and run the rest of the script
:Z
run the commands to file2.txt and run the rest of the script
나는 "goto"와 "tags"가 bash에 존재하지 않는다는 것을 알고 있지만 bash에서 위와 유사한 작업을 수행하는 다른 방법은 무엇입니까?
시도:
#!/bin/bash
if [ -e file1.txt ]; then
echo "file1.txt ok"
if [ -e file2.txt ]; then
echo "file2.txt ok"
alternative to goto label Z
else
alternative to goto label Y
fi
else
echo "file1.txt doesn't exist"
alternative to goto label X
fi
PD: 아이디어를 전달하기 위해서만 사용되는 기본 대본
bash도 수행해야 하는 일괄 처리가 수행하는 작업(혼란을 피하기 위해 중요):
전체 스크립트는 일부 명령을 실행하고 file1.txt 및 file2.txt 파일을 생성합니다. 그래서 스크립트가 길고 어느 시점에서 중단될 수 있으므로 중단된 부분부터 스크립트를 시작하고 싶습니다. 검증의 목적은 다음과 같습니다.
- file1.txt가 존재하는 경우(Y), 스크립트는 이를 이미 생성한 것이며 file2.txt(Z)가 존재하는지 계속 확인합니다(스크립트의 또 다른 부분).
- file2.txt가 존재하면(Z) 해당 지점부터 명령이 시작된다는 의미입니다.
- file2.txt(Z)는 존재하지 않지만 file1.txt(Y)는 존재하는 경우, file1.txt(Y)와 file2.txt(Z)를 생성한 후 file1 start부터 시작하는 사이에 스크립트가 중단되었음을 의미합니다. 문자(예)
- file1.txt(Y)와 file2.txt(Z)가 모두 없으면 스크립트 처음부터 시작해야 합니다(X).
답변1
배치 스크립트가 수행해야 하는 작업을 정확히 알고 나면 먼저 이를 조금 단순화하겠습니다.
@echo off
if exist "file1.txt" goto skip_part1
run the script from the beginning and file1.txt and file2.txt are created and the rest of the script is executed
:skip_part1
if exist "file2.txt" goto skip_part2
run the commands to file1.txt and run the rest of the script
:skip_part2
run the commands to file2.txt and run the rest of the script
다음과 같이 동등하게 작성할 수 있습니다.
@echo off
if not exist "file1.txt" (
run the script from the beginning and file1.txt and file2.txt are created and the rest of the script is executed
)
if not exist "file2.txt" (
run the commands to file1.txt and run the rest of the script
)
run the commands to file2.txt and run the rest of the script
이는 다음 bash 스크립트로 직접 변환될 수 있습니다.
#!/bin/bash
if [ ! -e file1.txt ]; then
run the script from the beginning and file1.txt and file2.txt are created and the rest of the script is executed
fi
if [ ! -e file2.txt ]; then
run the commands to file1.txt and run the rest of the script
fi
run the commands to file2.txt and run the rest of the script
답변2
이상해 보이더라도 스크립트는 거의 자동으로 변환합니다! 단계는 다음과 같습니다
- 스크립트 시작 부분에 삽입
_current_label="_first_state"
main_function(){
case "$_current_label" in
("_first_state")
- 스크립트 끝에 추가
_current_state="_the_end"
return
;;
esac
}
while [ "$current_state" != "_the_end" ] ; do main_function ; done
- 각각
:label
으로 변경되었습니다.
_current_label="label"
;;
("label")
- 각각
goto skip_part1
으로 변경되었습니다.
_current_label="skip_part1"
return
따라서 스크립트는 다음과 같습니다
#!/bin/bash
_current_label="_first_state"
main_function(){
case "$_current_label" in
("_first_state")
_current_label="step1"
;;
("step1")
if [ -e file1.txt ]; then
echo "file1.txt ok"
_current_label="step2"
return
else
echo "file1.txt doesn't exist"
_current_label="X"
return
fi
_current_label="step2"
;;
("step2")
if [ -e file2.txt ]; then
echo "file2.txt ok"
_current_label="Z"
return
else
_current_label="Y"
return
fi
_current_label="X"
;;
("X")
run the script from the beginning and file1.txt and file2.txt are created and the rest of the script is executed
_current_label="Y"
;;
("Y")
run the commands to file1.txt and run the rest of the script
_current_label="Z"
;;
("Z")
run the commands to file2.txt and run the rest of the script
_current_label=""
return
;;
esac
}
while [ "$current_label" != "" ] ; do main_function ; done
아이디어는 매우 간단한 유한 상태 머신을 구축하는 것입니다. 각 상태는 Case 문의 레이블입니다. 각 상태에서 goto
원본 코드에서 전역 값을 설정하고 반환하는 지점 _current_label
또는 레이블이 나타날 때까지 코드를 실행합니다 . 그런 다음 루프는 이 새 레이블에서 시작하여 Case 문이 다시 실행되도록 합니다.
"자동" 번역은 결코 실행될 수 없는 일부 코드를 넣습니다.
call
이 "자동" 번역은 또는 진술을 처리하지 않습니다 start
.
생성된 스크립트를 들여쓰기할 수 있는 도구가 있다면 실행하는 것이 좋습니다!