Unix Shell脚本:如果目录中不存在给定的扩展文件,则显示自定义消息

时间:2016-06-08 10:24:28

标签: bash shell unix

我有以下unix shell脚本,用于列出给定目录中的文件。只有我们需要传递文件的扩展名,脚本应列出文件或文件或显示自定义消息。

我的尝试:

脚本

#!/bin/sh

FileNameWithPath=`ls home\docs\customers\*.$1 | wc -w`

if [ $FileNameWithPath -gt 0 ]
then
     ls home\docs\customes\*.$1
else
     echo "Custom Message about failure(File not found)"
fi

生成

$ ./Test.sh txt

注意:如果我提供存在的文件扩展名,但上面的脚本工作正常,但如果我给出一些非存在的文件扩展名,它将通过错误加上自定义错误消息。我只想打印自定义消息。

4 个答案:

答案 0 :(得分:2)

您可以使用一个命令执行此操作:

ls home/docs/customers/*.$1 2> /dev/null || echo "Custom message about failure (File not found)"

第一个命令('ls')尝试列出文件。如果失败,它将打印错误消息(由'2> / dev / null'抑制)并返回错误代码。由于退出代码与0不同,因此将执行第二部分('echo')。

如果您想保留代码,可以通过以下方式删除 ls 错误,将 stderr 重定向到 / dev / null : / p>

FileNameWithPath=`ls home\docs\customers\*.$1 2>/dev/null | wc -w`

答案 1 :(得分:1)

这不需要使用ls

你可以用globbing本身来做到这一点:

# turn on glob failure for no matches
shopt -s failglob

# list files or a custom error message
(echo home/docs/customers/*."$1") 2>/dev/null ||
echo "Custom Message about failure"

答案 2 :(得分:0)

您收到的错误消息发生在您分配给FileNameWithPath的行中。您可以通过将其重定向到/ dev / null来抑制它。即2>/dev/null

使用$()代替反引号运算符要好得多(并且符合Posix),因为您使用#!/bin/sh而不是#!/bin/bash启动了脚本。然后,您将可以穿过现代的bourne shell。 使用$()的另一个重大胜利是它们可以轻松嵌套,而你必须在嵌套时逃避反引号。

正如Andrea Carron在回答中指出的那样,你可以使用||逻辑运算符或运算符在一行上完成整个事情。这是一个非常常见的习语。

如果您的MVCE引用更复杂的东西,我会在下面为您修复它。

#!/bin/sh

FileNameWithPath=$(ls home\docs\customers\*.$1 2>/dev/null | wc -w)

if [ $FileNameWithPath -gt 0 ]
then
     ls home\docs\customes\*.$1
else
     echo "Custom Message about failure(File not found)"
fi

答案 3 :(得分:0)

只需在脚本第二行的null设备文件中添加错误重定向: -

FileNameWithPath=`ls home\docs\customers\*.$1 2>/dev/null | wc -w`