
while 읽기 루프 내에서 입력 읽기가 작동하지 않는 것 같습니다.
while read line
do
echo "get some input from the user"
read response
done < some_file.txt
읽기가 루프 외부에 있었던 것처럼 실행이 일시 중지되지 않습니다. 왜 이런거야? while 읽기 루프 내에서 입력을 읽는 해결 방법이 있습니까?
답변1
문제는 read line
와 가 모두 read response
에서 데이터를 기대하고 얻는다는 것입니다 stdin
.
이 질문SO에서는 더 많은 정보에 대한 링크와 함께 그 중 일부를 설명합니다.
tl;dr
허용되는 답변은 다음과 같습니다.
제어 터미널 장치에서 읽으십시오:
read input </dev/tty
답변2
내부 읽기 명령이 stdin을 사용하고 while 루프에 대해 다른 파일 설명자를 사용하도록 합니다.
while read -u 3 line; do
read -p "get some input from the user" response
done 3< some_file.txt
답변3
고마워요 니플! 그리고 bgStack에게도 감사드립니다. 몇 시간 동안 검색한 끝에 마침내 답을 얻었습니다! 훌륭해요!! 내 터미널 경로를 감지하기 위해 "echo $(tty)"를 사용했거나 그냥 변수로 사용했습니다. 나에게 그것은 다른 사용 사례였습니다. U는 파일을 읽고 있었고 실행을 확인하고 싶습니다. 어쩌면 아래 예가 다른 사람에게 도움이 될 수도 있습니다.
#!/bin/bash
export terminal=$(tty)
cat file | while read val1 val2
do
while true;
do
read -p "would you like to XYZ" yn
case $yn in
[Yy]* ) echo "# Move $val1 to $val2 #";break;;
[Nn]* ) echo "#---------no action----------#";break;;
* ) echo "# Please answer yes or no. #";;
esac
done < $terminal
done
답변4
Nifle은 정확히 맞습니다. 그러나 여러 터미널을 사용하는 경우에는 구체적이어야 합니다.
Google에서 오신 분들은 이 페이지를 찾으신 것을 축하드립니다. while 읽기 루프(여기에는 rm -i
, 또는 기타 항목 포함) 중에 사용자 입력을 수행해야 하는 경우 read
사용할 입력 파이프를 지정할 수 있습니다.
다음은 제가 사용한 이 솔루션의 일부입니다.
#in declarations
thistty=$(tty)
lsuser -R LDAP -a home pgrp ALL 2>/dev/null | while read line
do
homedir=$(echo $homedir | awk -F= '{print $2}')
sudo rm -ir "$homedir" < $thistty
done