bash: 파일을 읽을 때 사용자에게 입력을 요청하는 방법은 무엇입니까?

bash: 파일을 읽을 때 사용자에게 입력을 요청하는 방법은 무엇입니까?

사용자 입력을 위한 다음 스크립트 문은 if 블록 아래의 while 루프에 중첩되어 있지만 효과가 없으며 건너뜁니다. 사용자 입력을 작동시키는 방법은 무엇입니까?

exec 3<&0 && read -p 'Enter your answer: ' uservar <&3

FILE="hostnames.txt"
echo $(sudo chmod +777 $FILE)
echo "Step 1. Checking if file with hostnames exists."

#exec 3<&0

if [ -f "$FILE" ]
then
  echo "PASSED: File hostnames.txt does exist." && echo ""
  while IFS= read -r hostname;
    do
     echo "Step 2. Checking Grph mgmt_con_ip4 exists for $hostname"
     mgmt_con_ip4="$(echo "$(llama-grph node show $hostname | grep mgmt_con_i$
     echo "Grph has management IPv4 address: $mgmt_con_ip4"
     if [ -z $mgmt_con_ip4 ]
       then
         echo "PASSED: Grph mgmt_con_ip4 == NULL" && echo ""
       else
         echo "FAILED: Grph mgmt_con_ip4 == NOT NULL" && echo ""
         echo "$(ipam --format json get-cidr-parent $mgmt_con_ip4)" && echo ""
         echo "WARNING: OOB networks shouldn't have $mgmt_con_ip4 IPv4 addres$
         exec 3<&0 && read -p 'Enter your answer: ' uservar <&3
     fi
  done < $FILE
fi


답변1

read동일한 명령 (FD)을 혼합해서는 안 됩니다 file descriptor input. 아래 예에서는 가장 바깥쪽 readFD=3을 변경했습니다. 코드 조각은 다음과 같습니다.

  #!/bin/env bash

  FILE="/etc/hosts"
  exec 3<${FILE} 2>/dev/null || exit 1
  
  while IFS= read -ru3 TDATA ; do
      echo "${TDATA}"

      echo -n "Are you sure to loop again? (y/n) "
      read -rn1 YN
      echo
      if [[ ! ${YN} =~ ^[Yy]$ ]] ; then
          echo "No more turning around."
          exec 3<&- # close file
          exit 1
      fi
  done
  exec 3<&- # close file

관련 정보