空の出力に応答してifステートメントを使用する必要があります。私は持っています:
while read -p "Enter filename: "
do Extant=$(ls | grep $name)
echo "$Extant"
結果を保存して表示します。大丈夫です…ファイル名が存在しなくなるまでです。私はそれが欲しい:
$Extantが空であることを確認します(ファイルが存在しないことを示します)。
そして、「ここはありません」のような言葉で答えます。
その後、whileループに戻ります。
そうでなければ
whileループに戻ります(存在する場合は一致するファイルを出力するため)。
私は最初に次の方法でこれを行うことができると思いました。
if $Extant=""
then echo "it's not here"
return
else
return
fi
しかし、それは私が望むようにはなりませんでした。コマンドと同様に、見つかった内容を実行し続けます。
ここで何が起こっているのかよくわかりませんが、助けてくれてありがとう。
答え1
ここではls
両方を使用したくありませんgrep
。 ls
主に視覚的grep
主に大きなテキストからテキスト行を返すために使用されるディレクトリの内容を確認してください。
IFS= read -r -p 'Filename please: ' name
while [[ ! -e $name ]]; do
printf '%s does not exist\n' "$name"
read -p 'Try again: ' name
done
printf '%s exists\n' "$name"
その名前がファイルシステムに存在する場合、テスト-e
は真です。ここではループテストのポイントを否定します。
2回の別々の呼び出しを避けるには、次の手順を実行しますread
。
while true; do
IFS= read -r -p 'Filename please: ' name
[[ -e $name ]] && break
printf '%s does not exist\n' "$name"
done
printf '%s exists\n' "$name"
break
$name
このループは、指定された値がファイルシステムに存在する限り終了します。
これらのバリエーションのどれも改行文字を含むファイル名を読み取ることができません(改行文字はUnixシステムのファイル名に有効です)。
ユーザーがファイル名をコマンドライン引数としてスクリプトに渡す方が便利です。つまり、シェルのファイル名補完機能またはファイル名グロービングパターンを使用してファイル名を指定できます。
#!/bin/bash
name=$1
if [[ ! -e "$name" ]]; then
printf '%s does not exist\n' "$name"
exit 1
fi
printf '%s exists\n' "$name"
上記のスクリプトは、単一のファイル名を唯一の引数として実行することを期待しています。指定された名前の存在に関連するメッセージを印刷します。その名前が存在しない場合、スクリプトはif
ステートメント内で終了し、ユーザーは再試行する必要があります。
この変化会議read
.
関連: