Fra*_*ank 6 error-handling bash shell
在bash脚本中,我必须检查是否存在多个文件.
我知道一种笨拙的方法,如下所示,但这意味着我的主程序必须在那个丑陋的嵌套结构中:
if [ -f $FILE1 ]
then
if [ -f $FILE2 ]
then
echo OK
# MAIN PROGRAM HERE
fi
fi
Run Code Online (Sandbox Code Playgroud)
以下版本不起作用:
([ -f $FILE1 ] && [ -f $FILE2 ]) || ( echo "NOT FOUND"; exit 1 )
echo OK
Run Code Online (Sandbox Code Playgroud)
它打印
NOT FOUND
OK
Run Code Online (Sandbox Code Playgroud)
有一种优雅的方式来做到这一点吗?
更新:查看接受的答案.另外,在优雅方面我喜欢Jonathan Leffler的回答:
arg0=$(basename $0 .sh)
error()
{
echo "$arg0: $@" 1>&2
exit 1
}
[ -f $FILE2 ] || error "$FILE2 not found"
[ -f $FILE1 ] || error "$FILE1 not found"
Run Code Online (Sandbox Code Playgroud)
Joh*_*itb 10
怎么样
if [[ ! ( -f $FILE1 && -f $FILE2 ) ]]; then
echo NOT FOUND
exit 1
fi
# do stuff
echo OK
Run Code Online (Sandbox Code Playgroud)
查看help [[和help test使用[[样式测试可用的选项.另请阅读此常见问题解答条目.
您的版本不起作用,因为会(...)生成一个新的子shell,exit执行该子shell .因此它只影响子shell,但不影响执行脚本.
以下工作,{...}在当前shell 之间执行命令.
我还应该注意,你必须引用两个变量以确保没有不必要的扩展或分词(它们必须作为一个参数传递[).
[ -f "$FILE1" ] && [ -f "$FILE2" ] || { echo "NOT FOUND"; exit 1; }
Run Code Online (Sandbox Code Playgroud)
我认为您正在寻找:
if [ -f $FILE1 -a -f $FILE2 ]; then
echo OK
fi
Run Code Online (Sandbox Code Playgroud)
请参阅man test以获取更多有关可以放入的信息[ ]。
| 归档时间: |
|
| 查看次数: |
10231 次 |
| 最近记录: |