如果文件不存在则退出 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,它不会做任何事情。