bash脚本无法要求确认

时间:2019-02-07 20:23:32

标签: linux bash shell

我正在开始使用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

有人知道为什么会这样或者我在做什么错吗?

2 个答案:

答案 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