我有以下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
注意:如果我提供存在的文件扩展名,但上面的脚本工作正常,但如果我给出一些非存在的文件扩展名,它将通过错误加上自定义错误消息。我只想打印自定义消息。
答案 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`