shell脚本中的条件mysql操作

时间:2013-01-27 20:32:56

标签: mysql bash shell unix

我有以下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命令。我如何修改上述脚本来执行此操作?

3 个答案:

答案 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"