[ -z "${foo/[yn] 和 [-z 表达式] 在 bash 中意味着什么?

[ -z "${foo/[yn] 和 [-z 表达式] 在 bash 中意味着什么?

语境:在 read -u 时,使用专用 fd 为文件的每一行运行命令行。
关联:https://stackoverflow.com/a/13941223/15603477

while read -u 7 filename;do
    ans=
    while [ -z "$ans" ]; do
        read -p "Process file '$filename' (y/n)? " -sn1 foo
        [ "$foo" ] && [ -z "${foo/[yn]}" ] && ans=$foo || echo '??'
    done
    if [ "$ans" = "y" ]; then
        echo Yes
        echo "Processing '$filename'."
    else
        echo No
    fi
done 7<file.txt

我不明白堵塞:

do
    read -p "Process file '$filename' (y/n)? " -sn1 foo
    [ "$foo" ] && [ -z "${foo/[yn]}" ] && ans=$foo || echo '??'
done

我用谷歌搜索SN1,似乎没有什么好结果。-z也不容易查到。
我知道的;

“&&”用于将命令链接在一起,这样当且仅当前一个命令无错误退出(或者更准确地说,以返回码 0 退出)时才运行下一个命令。

${parameter/pattern/string} 模式被扩展以产生模式,就像文件名扩展一样。参数被扩展,并且模式与其值的最长匹配被替换为字符串。

但在这儿${foo/[yn]}没有替换字符串。

答案1

阅读man bash

read

-s 静音模式。如果输入来自终端,则不会回显字符。

-n nchars read 阅读后返回 nchars 字符而不是等待完整的输入行,但如果在分隔符之前读取的字符少于 nchars,则遵循分隔符。

该代码read -p "Process file '$filename' (y/n)? " -sn1 foo打印提示并读取单个字符而不回显输入。

-z string 如果字符串长度为零,则为 True。

${parameter/pattern/string} ... 如果细绳为空,匹配图案被删除并且/以下模式可以被省略。

代码[ "$foo" ]&& [ -z "${foo/[yn]}" ]&& ans=$foo || echo '??'

检查 foo 是否为其中之一yn否则打印 '??'

相关内容