语境:在 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 是否为其中之一y
,n
否则打印 '??'