我想知道为什么在没有提供参数的情况下我的脚本仍然不运行条件。我认为这可能是我的 if 语句的顺序,但我不确定。有什么建议吗?这似乎不是像错位空格这样的简单错误。
for param in "$@";
do
if [[ -n $confirm ]]; #this is a getopts switch asking for confirmation like rm -i
then
#asks user whether to confirm deletion
if [ $answer != [Yy]* ]];
then
continue #go to next param argument
fi
fi
if [ -z "$param" ] #if no argument has been specied,
then
#print an error that additional operand is needed.
elif [ -d ./$param ] #if a directory name is specified
then
if [[ -n $recursive]] #getops recursive switch, like rm -r
then
#recursively delete a directory
fi
#error message about deleting directory without -r switch
elif [ ! -e ./$param ]
then
#If not an existing file either then print error that there is no such file or directory
elif [[ $param = "safe_rm" ]] || [[ $param = "safe_rm_res" ]]
then
#This prevents script from trying to delete itself or restore script
fi
if [[ -n $verbose ]] third and final getopts switch, similar to rm -v
then
#message confirming deletion
fi
done
我的代码是关于制作回收站的,它基于命令rm
,其中脚本也具有和使用开关,其方式与rm -i -v
和相同-r
。上面的 if 语句根据参数改变了我处理删除的方式。第一个 if 语句是关于参数是否是目录。第二个是是否是文件,第三个是是否为空,第四个是参数是否为自身(删除自身)
答案1
for
用于迭代参数的循环将在满足其条件(列表末尾)时终止并转到其语句done
。当脚本到达for
不带参数的循环时,列表的开头与结尾相同,并且循环的条件为 false。
在原始示例中,如果给定空字符串,循环内部的命令将产生不正确的结果。如果变量“param”为空,第一个案例[ -d ./$param ]
将匹配之前的当前目录./
,并且脚本到达空字符串检查[ -z "$param" ]
。