2017-11-13 12 views
1

프로세스가 사용자 입력에 따라 다르지만 1 분 과정 인 bash 스크립트를 작성했으며 사용자가 원할 경우 루프가 끝나기를 기다려야한다. 다음은 코드입니다 :Bash : 프로세스가 끝날 때까지 기다리지 않고 한 번에 모든 입력을 수집합니다.

while [[ ! "$addstr" =~ ^[Nn](.*)?$ ]]; do 
    read -p "[*] String to permute around: " string 
    echo; sleep 0.1s 

    while [[ ! "$string" =~ ^[0-9a-zA-Z]+$ ]]; do 
     echo "[!] Only alphanumeric strings are allowed!"; sleep 0.1s 
     read -p "=> " string 
     echo; sleep 0.1s 
    done 

    ## PROCESS ## 

    echo "[?] Do you want to permute around another string?"; sleep 0.1s 
    read -p "=> " addstr 
    echo; sleep 0.1s 

    while [[ ! "$addstr" =~ ^[YyNn](.*)?$ ]]; do 
     echo "[!] Type again:" 
     read -p "=> " addstr 
     echo; sleep 0.1s 
    done 
done 

내가 뭘 원하는 것은 그들 각각의 변수를 저장하고 필요로하는 과정을 여러 번 실행, 사용자가 한 번에 모든 문자열을 입력 할 수 있도록하는 것입니다 ... 나는 "$ 문자열"다음에 "$ 카운터"를 추가하는 등 많은 작업을 시도했지만이 작업을 수행 할 수 없었습니다. 매우 간단하고 지식이 없다고 생각합니다.

+0

가 잠을 제거,이 과정을 단축합니다. – karakfa

+0

나는 프로그램이 그들과 함께 흐르는 방식을 좋아한다. 그냥 개인적인 것 – Dantalion

답변

1

stdin에서 입력을 읽는 스크립트. 그런 다음 사용자가 파일에서 리디렉션 할 수 있습니다.

귀하의 스크립트가됩니다 :

while IFS= read -r string; do 
    if [[ ! "$string" =~ ^[0-9a-zA-Z]+$ ]]; do 
     echo "[!] Only alphanumeric strings are allowed! $string" 
     continue 
    fi 

    ## PROCESS ## 
done 

그리고 스크립트의 표준 입력에 데이터를 공급하는

./yourscript < file.with.strings 

또는 다양한 다른 방법 등 사용자 유형 뭔가를.


또 다른 생각 (앞)까지의 모든 입력을 수집 :

inputs=() 
while true; do 
    read -p "[*] String to permute around: " string 
    echo; sleep 0.1s 

    while [[ ! "$string" =~ ^[[:alnum:]]+$ ]]; do 
     echo "[!] Only alphanumeric strings are allowed!"; sleep 0.1s 
     read -p "=> " string 
     echo; sleep 0.1s 
    done 

    # store the user input 
    inputs+=("$string") 

    echo "[?] Do you want to permute around another string?"; sleep 0.1s 
    read -p "=> " addstr 
    echo; sleep 0.1s 

    while [[ ! "$addstr" =~ ^[[:blank:]]*[YyNn] ]]; do 
     echo "[!] Type again:" 
     read -p "=> " addstr 
     echo; sleep 0.1s 
    done 

    [[ "$addstr" =~ ^[[:blank:]]*[Nn] ]] && break 
done 

## PROCESS ## 
for string in "${inputs[@]}"; do 
    process "$string" 
done 
+0

또한, 정규 표현식은'^ [[: alnum :]] + $'와 같은 문자 클래스로 작성 될 수 있습니다. –

+0

더 큰 프로그램의 일부이기 때문에 그것을 할 수 없습니다. , 고맙습니다. 정규 표현식에 대해서 : 예, 완전히 잊어 버렸습니다. 다시 감사합니다! – Dantalion

+0

그건 말이되는 것 같지만, 추가 된 구문을 설명해 주시겠습니까? 나는 아직도 배우고있어 'inputs()', 'inputs + = ("$ string") 및'$ {inputs [@]} '같은 것들을 얻을 수 없습니다. – Dantalion