ユーザー入力用の次のスクリプトステートメントは、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
。次の例では、最も外側のread
FD = 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