goto없이 bash 스크립트를 해결하십시오.


1

나는 내가하고 싶은 bash 스크립트를 가지고있다

read one_thing
read another_thing

그런 다음 일부 코드를 실행하여 another_thing사용 가능한지 또는 이미 가져온 것인지 확인하고 가져온 경우 사용자에게 경고하고 다시 실행해야합니다.

read another_thing

그래서 우리는 새로운 가치를 가질 수 있습니다 one_thing. gotobash 에는 없기 때문에 그렇게하는 방법이 궁금합니다. 지금까지 가장 좋은 추측 read another_thing은 함수 내부 를 래핑해야 하므로 필요할 경우 자체 호출하지만 "깨끗한"방법이 있어야한다고 생각합니다. 효율적인 방법에 대한 제안을 찾고 있습니다.


3
이 질문은 스택 교환에 더 적합합니다. 어쨌든, read 문을 while 루프로 묶고 while $a==0another_thing이 올바르게 읽 히면 $ a를 1로 변경하십시오.
terdon

실제 코드를 제공하여 수행하려는 작업을 더 잘 파악할 수 있습니다.
JamesBarnett

스크립트와 일부 스크립팅 언어 질문은 수퍼 유저 에게는 괜찮지 만 대부분의 프로그래밍 문제는 StackOverflow를 사용하여 더 잘 해결됩니다.
James Mertz

이 질문은 여기있을 수 있습니다. 우리는 항상 고급 사용자가 사용하기 때문에 주제에 대해 bash 스크립트를 고려했습니다.
slhck

답변:


2

루프 상태를 확인하고 break충족 될 때 그 상태를 확인할 수 있습니다 .

#!/bin/bash

read -p 'Input something > ' one_thing

while true; do
  read -p 'Input something else > ' another_thing

  # Write some code to check if the requirements are met
  # Let's say in this case they are when the variable `thing_to_work` equals `done`

  if [[ "${thing_to_work}" == 'abcde' ]]; then
    break # Exit the loop
  else
    echo 'The requirements were not met, so the loop will start again'
  fi
done

2

내 바탕 화면에 윈도우에서 리눅스로 이동할 때, 나는 기존의 많이했다 .BAT.CMD변환 할 파일을 내가 그들을 위해 논리를 재 작성하지 않을, 그래서 내가 발견 을 할 수있는 방법 goto때문에 작동 배쉬를 goto함수는 sed자체적으로 실행 되어 실행해서는 안되는 스크립트 부분을 제거하고 모든 것을 회피합니다.

#!/bin/bash

# BAT / CMD goto function
function goto
{
    label=$1
    cmd=$(sed -n "/^:[[:blank:]][[:blank:]]*${label}/{:a;n;p;ba};" $0 | 
          grep -v ':$')
    eval "$cmd"
    exit
}

apt update

# Just for the heck of it: how to create a variable where to jump to:
start=${1:-"start"}
goto "$start"

: start
goto_msg="Starting..."
echo $goto_msg
# Just jump to the label:
goto "continue"

: skipped
goto_msg="This is skipped!"
echo $goto_msg

: continue
goto_msg="Ended..."
echo "$goto_msg"

# following doesn't jump to apt update whereas original does
goto update

Linus Torvalds가 유명하게 말한 것처럼 나는 죄책감을 느끼지 않습니다.

From : Linus Torvalds
주제 : Re : 2.6.0-test *의 기회가 있습니까?
날짜 : 2003 년 1 월 12 일 일요일 11:38:35 -0800 (PST)

나는 goto가 훌륭하다고 생각하며, 많은 양의 들여 쓰기보다 읽기 쉽습니다. 그건 특히 코드의 흐름이 실제로 자연스럽게 들여 쓰기되지 않은 경우는 true (이이 경우에, 그래서 고토를 사용하여 어떤 방식으로 생각하지 않습니다 명확 하지 않는 것보다,하지만 일반적으로 고토에서의 가독성을 위해 아주 좋은 수 있습니다).

물론 레이블을 설명 할 수없는 파스칼과 같은 어리석은 언어에서는 goto가 잘못 될 수 있습니다. 그러나 그것은 goto의 잘못이 아니며, 언어 디자이너의 두뇌 손상입니다.

코드 소스 (오류가 덜 발생하도록 수정)
견적 소스


2
탁월한 사용 사례와 창의적인 솔루션!
JakeGould

@JakeGould 감사합니다! 나는 이것이 순수한 철학적 이유로 공감대를 끌어들일 것이라는 것을 알았으므로, 모든 프로그래머가 JMP를 사용 하든 원하지 않든간에 당신의 "감사합니다"는 저를 도와줍니다 ... ;-)
Fabby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.