如何回显不返回任何内容/null 的命令的输出?

如何回显不返回任何内容/null 的命令的输出?

我想从不返回任何内容的命令的输出中回显某些内容。

这是fnames.txt的内容

company_TOYOTA_666_696969696*
company_FORD_123_435345666*
company_MAZDA_333_333333333*
company_HONDA_777_777777777*
company_FERARI_999_999999999*

这是我的脚本,用于从 fnames.txt 中查找一行中的每个文件:

#!/bin/sh

while read -r LINE
do
    output=$(find . -name "$LINE")

    if [[ $output ]];
    then
            printf "$output\n"
    elif [[ $output -eq 0 ]];
    then
            echo "$LINE Not Found"
    fi
done < /path/to/fnames.txt

但是当我尝试执行它时,它只输出找到的文件,而不输出回显未找到的文件名的 elif 语句:

./company_TOYOTA_666_696969696_11_22_33_4542352345.dat
./company_FORD_123_435345666_11_22_33_4542352345.dat
./company_MAZDA_333_333333333_11_22_33_4542352345.dat
./company_HONDA_777_777777777_11_22_33_4542352345.dat

我希望它输出这样的内容:

./company_TOYOTA_666_696969696_11_22_33_4542352345.dat
./company_FORD_123_435345666_11_22_33_4542352345.dat
./company_MAZDA_333_333333333_11_22_33_4542352345.dat
./company_HONDA_777_777777777_11_22_33_4542352345.dat
company_FERARI_999_999999999* Not Found

答案1

您可以使用-z-n字符串测试运算符:

String operators:

  -z STRING      True if string is empty.

  -n STRING
     STRING      True if string is not empty.

例如

while read -r LINE; do 
  output=$(find . -name "$LINE")
  if [[ -z "$output" ]]; then 
    echo "$LINE not found"
  else 
    echo "$output"
  fi
done < fnames.txt 
company_TOYOTA_666_696969696* not found
./company_FORD_123_435345666asdfgh
company_MAZDA_333_333333333* not found
./company_HONDA_777_7777777771242jkk
company_FERARI_999_999999999* not found

在哪里

$ ls -1 company*
company_FORD_123_435345666asdfgh
company_HONDA_777_7777777771242jkk

答案2

我建议利用grep并返回代码,让生活变得更简单。

while read -r LINE
do
    find . -name "${LINE}" | grep "${LINE}" || echo "${LINE} not found"

done < /path/to/fnames.txt

这是如何运作的:

  • find . -name "${LINE}"很确定你知道这个,在当前目录中查找匹配的文件${LINE}
  • | grep "${LINE}"将输出通过管道传输到grep.我们这样做是为了产生一个返回值,find通常不会产生有用的值。如果grep匹配某些内容,则将打印匹配项,并且命令返回 0。如果没有匹配任何内容,则不会打印任何内容,并返回非零返回值。

  • || echo "${LINE} not found"||是一个 OR 管道,如果它之前的命令之一返回非零,它将被执行。因此,如果grep返回非零(即没有找到匹配的文件),则执行此回显。如果之前的命令成功,则不会执行。

答案3

#!/bin/bash

while read -r LINE
do
    output=$(find . -name "$LINE" 2> /dev/null)

    if [[ -z $output ]]; then
        echo  "$LINE Not Found"
    else
        echo  "$output"
    fi
done < /path/to/fnames.txt

相关内容