带陷阱的Case语句(BASH)
如果把“case”和“trap”语句结合在一起,我仍然不太理解它们的概念 我想做什么: 触发trap语句时,它将删除脚本已创建的每个TMP(临时文件) 然而,当我试图运行这段代码时,有时脚本仍然会留下一些TMP文件带陷阱的Case语句(BASH),bash,Bash,如果把“case”和“trap”语句结合在一起,我仍然不太理解它们的概念 我想做什么: 触发trap语句时,它将删除脚本已创建的每个TMP(临时文件) 然而,当我试图运行这段代码时,有时脚本仍然会留下一些TMP文件 if [ "$#" -eq 1 ]; then TMP=./TMP$$ cat $FILENAME > $TMP case "$1" in -b*)awesomeFunction exit 0;; -B*)echo "E
if [ "$#" -eq 1 ]; then
TMP=./TMP$$
cat $FILENAME > $TMP
case "$1" in
-b*)awesomeFunction exit 0;;
-B*)echo "ERROR!" >&2; exit 1;;
*)echo "ERROR!" >&2; exit 1;;
esac
trap "rm -f $TMP" INT HUP TERM
fi
输出示例(触发trap语句后)
正确输出:
file1 file2
我的输出:
file1 file2 TMP23242 TMP24452
我把陷阱陈述放错地方了吗?任何人都可以给我一个建议,如何使脚本正确运行陷阱语句?谢谢。将陷阱语句放在代码的早期;在触发其中一个中断之前,不会执行内容。您可能希望使用
EXIT
而不是INT-HUP TERM
——特定于bash的EXIT
信号将触发处理程序,无论shell如何退出,无论是由于错误还是成功完成脚本。此外,它也不会删除所有TMP文件,“就是那个由那个脚本运行而产生的那个。”@glennjackman:是的,这就是我的意思。我是否正确地将陷阱语句放在了那里?您的if
和fi
语句不平衡。您的fi
比if
多。我会将trap语句移到TMP=…
下面的一行。正如mpez0所回答的,如果您的脚本在执行trap语句之前出错,它如何知道如何运行处理程序?您的意思是在if行的正下方?它如何知道$TMP tho?将它放在分配给TMP
的行之后。它可以工作!谢谢,我之前不知道陷阱必须直接放在TMP=
下面。我想它会被直接移除。