如何使用 if 语句测试 grep 的输出

如何使用 if 语句测试 grep 的输出

我需要使用 if 语句来响应空白输出。我有:

while read -p "Enter filename:   "
do Extant=$(ls | grep $name)
echo "$Extant"

来存储和显示结果。没关系...直到文件名不存在。我希望它:

  1. 测试 $Extant 是否为空(表明该文件不存在),

  2. 然后回应类似“它不在这里”之类的话

  3. 然后回到 while 循环

    要不然

  4. 只需返回到 while 循环(因为它将输出匹配的文件(如果存在))。

我最初想,我可以用类似的东西来做到这一点:

if $Extant=""
then echo "it's not here"
return
else
return
fi

但结果并不像我所希望的那样。它不断尝试运行它找到的内容,就像命令一样

不确定这里发生了什么,但我感谢任何帮助

答案1

你不想在这里使用ls也不grepls主要是为了视觉的检查目录内容,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为真。这里我们否定了循环中测试的意义。

为了避免两次单独调用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 系统上的文件名中有效)。


对于用户来说,将任何文件名作为脚本的命令行参数通常会更方便,这意味着他们可以使用 shell 的文件名完成功能或文件名通配模式来提供文件名:

#!/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.


有关的:

相关内容