我有以下shell脚本,它将find
命令中的卷写入文件,并将该文件加载到mysql数据库中:
# find all the paths and print them to a file
sudo find $FULFILLMENT/ > $FILE
sudo find $ARCH1/ >> $FILE
sudo find $ARCH2/ >> $FILE
sudo find $MASTERING/ >> $FILE
# load the file into the mysql database, `files`, table `path`
/usr/local/bin/mysql -u root files -e "TRUNCATE path"
/usr/local/bin/mysql -u root files -e "LOAD DATA INFILE '/tmp/files.txt' INTO TABLE path"
在添加新条目之前, TRUNCATE
将用于删除所有旧条目。但是,如果任何 find
命令不起作用(例如,如果卷不可访问),我希望它跳过两个mysql
命令。我如何修改上述脚本来执行此操作?
答案 0 :(得分:2)
仅当所有mysql
命令都成功时,才会执行两个find
命令:
# find all the paths and print them to a file
sudo find $FULFILLMENT/ > $FILE &&
sudo find $ARCH1/ >> $FILE &&
sudo find $ARCH2/ >> $FILE &&
sudo find $MASTERING/ >> $FILE &&
{
# load the file into the mysql database, `files`, table `path`
/usr/local/bin/mysql -u root files -e "TRUNCATE path"
/usr/local/bin/mysql -u root files -e "LOAD DATA INFILE '/tmp/files.txt' INTO TABLE path"
}
&&
运算符仅在LHS上的命令成功时才会运行RHS上的命令。 { ... }
将两个mysql
命令组合成一个复合命令,因此两者都运行(如果最后find
成功)或两者都不运行(如果最后find
不成功)。
如果无论find
成功还是mysql
命令运行,您的脚本还有更多内容可以运行。
答案 1 :(得分:0)
类似的东西:
sudo find $FULFILLMENT > $FILE || exit 1
答案 2 :(得分:0)
您可以使用#!/bin/bash -e
或在查找命令上方添加set -e
行。这样,一旦命令失败,Bash就会自动中止。默认情况下始终执行此操作是一种很好的做法,因为您很少想在上一个命令失败时继续执行此操作:
set -e
# find all the paths and print them to a file
sudo find $FULFILLMENT/ > $FILE
sudo find $ARCH1/ >> $FILE
sudo find $ARCH2/ >> $FILE
sudo find $MASTERING/ >> $FILE
# load the file into the mysql database, `files`, table `path`
/usr/local/bin/mysql -u root files -e "TRUNCATE path"
/usr/local/bin/mysql -u root files -e "LOAD DATA INFILE '/tmp/files.txt' INTO TABLE path"