如果或条件产生"integer expression expected"



以下代码生成错误"预期的整数表达式":

for SOURCE_PATH in work/sources/*; do
git diff --exit-code &>/dev/null || SOMETHING_TO_COMMIT=$?
if [ "$SOMETHING_TO_COMMIT" -eq "0" ] || [ "$SOMETHING_TO_COMMIT" -eq "" ] ; then
echo "NOTHING TO COMMIT FOR $SOURCE_PATH";
else
echo "COMMIT FOR $SOURCE_PATH"
git -C "$DIR/$SOURCE_PATH" commit -F ${COMMIT_MESSAGE_FILE}
fi
done

错误出在if [ "$SOMETHING_TO_COMMIT" -eq "0" ] || [ "$SOMETHING_TO_COMMIT" -eq "" ] ; then上。似乎[ "$SOMETHING_TO_COMMIT" -eq "0" ][ "$SOMETHING_TO_COMMIT" -eq "" ]应该产生整数。

如何解决?

您根本不需要将退出代码存储在变量中。如果git diff可以像最常见的 Linux/Unix 命令一样在失败时返回非零退出代码,则可以直接在 if 条件中

使用它
if ! git diff --exit-code &>/dev/null ; then
echo "NOTHING TO COMMIT FOR $SOURCE_PATH";

仅当git diff不成功且没有要提交的更改时,!运算符才会断言 if 条件为 true。此外,您应该将脚本更改为在 if 条件上断言 true,而在 else 部分失败,因为

if git diff --exit-code &>/dev/null ; then
echo "COMMIT FOR ${SOURCE_PATH}"
git -C "$DIR/${SOURCE_PATH}" commit -F "${COMMIT_MESSAGE_FILE}"
else
echo "NOTHING TO COMMIT FOR ${SOURCE_PATH}";
fi

这使它更具可读性和效率。

第二个测试将变量与空字符串 ("( 进行比较,但使用 -eq 仅适用于整数,因此您应该将其更改为 = 运算符:

if [ "$SOMETHING_TO_COMMIT" -eq "0" ] || [ "$SOMETHING_TO_COMMIT" = "" ] ; then

在当前的两个答案之间,意识到您不必对SOMETHING_TO_COMMIT进行条件赋值。只需将退出状态(无论是否为零(分配给参数即可;那么保证它有一些非空的整数值。

git diff --exit-code &>/dev/null; SOMETHING_TO_COMMIT=$?
if [ "$SOMETHING_TO_COMMIT" -eq 0 ]; then
echo "NOTHING TO COMMIT FOR $SOURCE_PATH";
else
echo "COMMIT FOR $SOURCE_PATH"
git -C "$DIR/$SOURCE_PATH" commit -F ${COMMIT_MESSAGE_FILE}
fi

正如 Inian 指出的那样,如果您只打算进行一次比较,则不需要保存退出状态;您可以使用git命令本身作为if条件。当您可能需要进行多个比较时,保存该值非常有用:

some_command; status=$?
if [ "$status" -eq 0 ]; then
...
elif [ "$status" -eq 1 ]; then
...
else
...
fi

相关内容

最新更新