如果文件不存在则退出 shell 脚本
Exit shell script if file doesn't exist
我有一个 .sql 作业,它根据特定条件创建文件,它使用 TEMP_ 前缀写入这些文件,因为我们有一个适配器可以拾取文件,我们不希望它们之前被拾取写作完成。
我需要放置一个 post 作业来重命名这些文件,我已经为它设置了许多其他作业,但它们每次 运行 时都会创建文件。根据系统中的数据,此作业有时只创建文件 运行s。
我需要检查文件是否存在,如果文件不存在则退出。
我找到了几个例子,但它们似乎都失败了,这就是我想到的地方,我认为它正在检查是否没有文件,如果没有文件则退出但它失败并显示:
“第 16 行的语法错误:`TEMP_SUBCON*.csv' 意外”
这是我目前拥有的,第 16 行是第一行 - 上面只是注释:
if [[ ! -f $OUT_DIR -name TEMP_SUBCON*.csv ]] ; then
exit $?
fi
TEMP_DATA_FILE=$(find $OUT_DIR -name TEMP_SUBCON_QTY_output*.csv)
DATA_FILE=$(basename $TEMP_DATA_FILE | cut -c6-)
echo $TEMP_DATA_FILE
echo $DATA_FILE
## Rename the file name, remove the phrase TEMP_, so that EAI can pick the file ##
mv $TEMP_DATA_FILE $OUT_DIR/$DATA_FILE
你能帮助指导我做错了什么吗?
谢谢
该语法对 [[ ... ]]
测试无效。
为什么不使用后面的find
命令的结果来检查指定目录下是否有匹配的文件,如果没有返回文件就退出(换句话说,如果result变量返回则退出)是空的)?
示例:
TEMP_DATA_FILE=$(find $OUT_DIR -name "TEMP_SUBCON_QTY_output*.csv" )
if [[ -z ${TEMP_DATA_FILE:=""} ]] ; then
exit 1
fi
注意 1:您应该引用 find
命令的模式参数,如图所示。
注意 2:如果变量在使用时被初始化(通常是错误的原因)而不是使用默认值,那么在您的 ksh 脚本中使用 set -u
会导致 ksh 中止是很有用的。但是,如果你使用 use set -u
那么在任何测试中你都应该明确地给出你自己的默认值。这就是使用 ${TEMP_DATA_FILE:=""} 而不是 ${TEMP_DATA_FILE} 的原因 - 以支持通常非常有用的 set -u
选项。即使您不使用 set -u
,${TEMP_DATA_FILE:=""} 内部测试也会明确说明应该发生什么,而不是依赖隐式行为。
注意 3:在调试和研究输出的每一行时,您应该使用 set -x
,它会准确地告诉您什么命令 运行 带有哪些参数以及结果是什么。这有助于您学习如何使用 ksh 和类似的 shell 进行编码。
如果我没理解错的话,你想在你的 $OUT_DIR 中找到带有 TEMP_ 前缀的文件,然后如果有则重命名不带前缀的文件。那应该可以解决问题
for file in $OUT_DIR/TEMP_SUBCON_*.txt; do
if [[ -e $file ]]; then
mv $file $OUT_DIR/${file#*SUBCON_}
fi
done
exit
它将通过目录查找每个 TEMP_ 文件并在没有它的情况下重命名它们。如果有none,它不会做任何事情。
我有一个 .sql 作业,它根据特定条件创建文件,它使用 TEMP_ 前缀写入这些文件,因为我们有一个适配器可以拾取文件,我们不希望它们之前被拾取写作完成。 我需要放置一个 post 作业来重命名这些文件,我已经为它设置了许多其他作业,但它们每次 运行 时都会创建文件。根据系统中的数据,此作业有时只创建文件 运行s。 我需要检查文件是否存在,如果文件不存在则退出。
我找到了几个例子,但它们似乎都失败了,这就是我想到的地方,我认为它正在检查是否没有文件,如果没有文件则退出但它失败并显示: “第 16 行的语法错误:`TEMP_SUBCON*.csv' 意外”
这是我目前拥有的,第 16 行是第一行 - 上面只是注释:
if [[ ! -f $OUT_DIR -name TEMP_SUBCON*.csv ]] ; then
exit $?
fi
TEMP_DATA_FILE=$(find $OUT_DIR -name TEMP_SUBCON_QTY_output*.csv)
DATA_FILE=$(basename $TEMP_DATA_FILE | cut -c6-)
echo $TEMP_DATA_FILE
echo $DATA_FILE
## Rename the file name, remove the phrase TEMP_, so that EAI can pick the file ##
mv $TEMP_DATA_FILE $OUT_DIR/$DATA_FILE
你能帮助指导我做错了什么吗?
谢谢
该语法对 [[ ... ]]
测试无效。
为什么不使用后面的find
命令的结果来检查指定目录下是否有匹配的文件,如果没有返回文件就退出(换句话说,如果result变量返回则退出)是空的)?
示例:
TEMP_DATA_FILE=$(find $OUT_DIR -name "TEMP_SUBCON_QTY_output*.csv" )
if [[ -z ${TEMP_DATA_FILE:=""} ]] ; then
exit 1
fi
注意 1:您应该引用 find
命令的模式参数,如图所示。
注意 2:如果变量在使用时被初始化(通常是错误的原因)而不是使用默认值,那么在您的 ksh 脚本中使用 set -u
会导致 ksh 中止是很有用的。但是,如果你使用 use set -u
那么在任何测试中你都应该明确地给出你自己的默认值。这就是使用 ${TEMP_DATA_FILE:=""} 而不是 ${TEMP_DATA_FILE} 的原因 - 以支持通常非常有用的 set -u
选项。即使您不使用 set -u
,${TEMP_DATA_FILE:=""} 内部测试也会明确说明应该发生什么,而不是依赖隐式行为。
注意 3:在调试和研究输出的每一行时,您应该使用 set -x
,它会准确地告诉您什么命令 运行 带有哪些参数以及结果是什么。这有助于您学习如何使用 ksh 和类似的 shell 进行编码。
如果我没理解错的话,你想在你的 $OUT_DIR 中找到带有 TEMP_ 前缀的文件,然后如果有则重命名不带前缀的文件。那应该可以解决问题
for file in $OUT_DIR/TEMP_SUBCON_*.txt; do
if [[ -e $file ]]; then
mv $file $OUT_DIR/${file#*SUBCON_}
fi
done
exit
它将通过目录查找每个 TEMP_ 文件并在没有它的情况下重命名它们。如果有none,它不会做任何事情。