首页 > 解决方案 > bash脚本无法要求确认

问题描述

我开始自己编写 shell 脚本,我需要向用户询问确认。

我有这个脚本,我不知道为什么下面的命令不起作用: 阅读 -p “你确定这个动作吗?” 因

我使用它两次,在脚本的开头和中间。第一次阅读有效,但第二次阅读......没有工作......

顺便说一句,我的 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

有谁知道为什么会发生这种情况或我做错了什么?

标签: linuxbashshell

解决方案


循环内部read从相同的源读取条件为 ( < "$1")。

并且不显示提示,因为它仅在输入来自终端时显示。

您可以通过添加明确地使内部read从终端读取< /dev/tty,例如:

read -p "holaaaa" yn < /dev/tty

或者您可以通过<&0重定向从标准输入中读取(文件描述符0用于标准输入)。正如评论者所指出的,这具有命令的调用者将能够提供预设响应的优点。例子:

read -p "holaaaa" yn <&0

推荐阅读