我正在开始使用shell脚本,我需要询问用户有关确认的信息。
我有这个脚本,我不知道为什么以下命令不起作用: 阅读-p“您确定要执行此操作吗?” yn
我在脚本的开始和中间使用了两次。 第一次阅读有效,但是第二次阅读...没有崩溃...
顺便说一句,我的linux发行版是debian 9.3
#!/bin/bash
read -p "holaaa" yn #HERE THE COMMAND WORKS AS EXPECTED
if [[ -e "$1" && -f "$1" ]]; then
while read nom grup permisos fitxer; do
if [ -e $fitxer ]; then
#echo $fitxer
#f=$(stat -c %n $fitxer) #jo voldria fer servir awk...
u=$(stat -c %U $fitxer)
g=$(stat -c %G $fitxer)
p=$(stat -c %a $fitxer)
if [[ "$p" != "$permisos" || "$u" != "$nom" || "$g" != "$grup" ]]; then
echo "Informacio al fitxer: $nom , $grup, $permisos, $fitxer"
echo "Informacio real: $u, $g, $p, $fitxer"
#posar confirmation
read -p "holaaaa" yn #HERE THE COMMAND IS NOT WORKING
chown $u:$g $fitxer
chmod $permisos $fitxer
fi
else
echo "file $fitxer does not exist"
fi
done < "$1"
else
echo "error" >&2
fi
有人知道为什么会这样或者我在做什么错吗?
答案 0 :(得分:5)
循环中的read
从条件为(< "$1"
)的同一源读取数据。
并且不显示提示,因为仅当来自终端的输入时才显示提示。
您可以通过添加read
来显式地使内部< /dev/tty
从终端读取,例如:
read -p "holaaaa" yn < /dev/tty
或者您也可以使用<&0
重定向从标准输入中读取(文件描述符0
用于stdin)。如注释者所指出的那样,这样做的优点是命令的调用者将能够提供固定的响应。示例:
read -p "holaaaa" yn <&0
答案 1 :(得分:2)
您有两个read
命令,它们打算使用相同的文件描述符(0)从不同的源读取(一个从给定文件中读取,另一个从脚本的标准输入中读取)。为$1
使用不同的文件描述符,以便其他read
可以继续从脚本的标准输入中读取,而不必用$1
覆盖。
#!/bin/bash
read -p "holaaa" yn
if [[ -f "$1" ]]; then
# Read from file descriptor 3
while read nom grup permisos fitxer <&3; do
if [ -e "$fitxer" ]; then
#f=$(stat -c %n $fitxer) #jo voldria fer servir awk...
u=$(stat -c %U $fitxer)
g=$(stat -c %G $fitxer)
p=$(stat -c %a $fitxer)
if [[ "$p" != "$permisos" || "$u" != "$nom" || "$g" != "$grup" ]]; then
echo "Informacio al fitxer: $nom , $grup, $permisos, $fitxer"
echo "Informacio real: $u, $g, $p, $fitxer"
#posar confirmation
read -p "holaaaa" yn
chown $u:$g $fitxer
chmod $permisos $fitxer
fi
else
echo "file $fitxer does not exist"
fi
done 3< "$1" # Attach $1 to file descriptor 3
else
echo "error" >&2
fi