[ -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

私はGoogleを検索しましたSN1、良い結果はないようです。-ジ検索も簡単ではありません。
わかりました。

"&&" は、前のコマンドがエラーなしで終了する場合 (より正確には戻りコード 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 文字列の長さがゼロの場合は真です。

${parameter/pattern/string} ...もしひも空、一致模様これは削除され、/次のパターンは省略できます。

パスワード[ "$foo" ]&& [ -z "${foo/[yn]}" ]&& ans=$foo || echo '??'

fooがそのうちの1つであることを確認しynそれ以外の場合は「??」を印刷します。

関連情報