所有,我有一个应用程序,用户选择一个压缩文件夹,然后使用 shell 脚本解压缩并重命名以进行处理。压缩文件夹将始终具有以下命名约定:“rXXXXX_CityName.info.zip”.zip 文件内的文件夹名称为“城市名称.info” 当 shell 脚本解压 zip 文件时,它会附加“rXXXX_”文件夹名称创建一个名为“rXXXXX_CityName.info”。在解压之前,shell 脚本会检查是否存在名为“rXXXXX_CityName.info”存在,如果存在则删除。代码如下:
THEZIPFILE="r12345_Boston.info.zip"
DIR="r12345_Boston.info"
if [ -d "$DIR" ]; then
rm -rf "$DIR"
sleep 1
fi
if [ ! -d "$DIR" ]; then
unzip -o "$THEZIPFILE" > /dev/null &
zpid=$!
wait $zpid
EXIT_STATUS=$?
if [ $EXIT_STATUS -eq 0 ]; then
rm -rf __MACOSX
# Do Some processing....
fi
echo $EXIT_STATUS
exit
else
echo "-1"
exit
fi
我想知道这段代码是否存在任何错误?我是否正确地假设上述代码将按顺序执行(即等待每个命令完成后再继续执行下一个命令)?
答案1
看起来还行,只是有些代码好像没必要?比如,你可以直接执行,而且无需等待rm
就可以运行。unzip
&
THEZIPFILE="r12345_Boston.info.zip"
DIR="r12345_Boston.info"
rm -rf "$DIR"
unzip -o "$THEZIPFILE" > /dev/null
EXIT_STATUS=$?
if [ $EXIT_STATUS -eq 0 ]; then
rm -rf __MACOSX
# Do Some processing....
fi
exit $EXIT_STATUS
答案2
这可能更适合 StackOverflow。
话虽如此,你可能走在正确的轨道上,但我不会那样做。
通常脚本会等到子程序退出,除非执行了某些特定操作来停止它们,具体来说,在命令&
末尾添加unzip
会告诉脚本继续执行而不等待。然后您需要编写相当多的代码来找出命令的进程 ID 并等到它完成。
我建议你直接删除它:
unzip -o "$THEZIPFILE" > /dev/null
您的命令sleep
之后rm
似乎也没有必要。
答案3
脚本$THEZIPFILE
在尝试解压之前不会验证是否存在。此外,如果$DIR
是纯文件而非目录,则在解压之前不会将其删除,从而导致错误。