我试图执行一个程序,该程序将根据提示符提供的完整路径创建一个目录,如果该目录已存在,它将返回一个错误(“目录已存在”)并再次询问递归函数中的名称。
这是我尝试过的:让我们说一个文件,test1
其中:
#!/bin/bash
echo "enter the directory name"
read ab
check(){
if (( echo `mkdir $ab` 2>/dev/null )); then
echo "directory created "
echo `ls -ld $ab`
exit
else
echo "try again "
echo "enter new value for directory:"
read ab
check
fi
}
check
这里的问题是,如果目录存在,那么程序可以正常工作,但如果不存在,那么它会创建它,然后转到程序的其他部分。
答案1
回声总是成功的。没有它和子外壳:
#!/bin/bash
echo "enter the directory name"
read ab
check(){
if mkdir "$ab" 2>/dev/null; then
echo "directory created "
ls -ld "$ab"
exit
else
echo "try again "
echo "enter new value for directory: "
read ab
check
fi
}
check
答案2
(( echo `mkdir $ab` 2>/dev/null )) bash: ((: echo 2>/dev/null : syntax error in expression (error token is "2>/dev/null ")
双括号包围算术表达式。该命令不会执行任何接近您预期的操作。mkdir $ab
不会向标准输出写入任何内容,因此`mkdir $ab`
是一个空字符串,因此算术表达式的内容是echo 2>/dev/null
。这里的符号>
是“大于”运算符,echo
是一个变量名。算术表达式在语法上不正确(变量后面不能跟有文字整数)。由于该命令在语法上不正确,因此它返回错误状态,并else
采用分支。
要测试命令的返回状态,只需编写该命令即可。
if mkdir -- "$ab" 2>/dev/null
附加提示:
- 从命令中隐藏错误不是一个好主意。用户需要知道错误是否是权限被拒绝、I/O 错误等。要在目录不存在时创建目录并在目录已存在时成功,请使用
mkdir -p -- "$ab"
. - 始终在变量替换周围使用双引号。
- 如果 的值
ab
以破折号开头,它将被解释为一个选项。首先放置--
以标记选项的结尾。
答案3
tries=0
while [ "$((tries+=1))" -le 5 ] || ! break
printf 'enter dirname: > '
IFS= read -r dir &&
if ! mkdir -- "$dir"
then echo try again
else ! echo Success\!
fi
do :; done
我不确定你为什么要否定这样的退出状态,但我认为上面应该得到类似于你正在寻找的反转的东西 - 并且它应该在有限数量的$tries
.
如果我运行它...?
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
然后再次...
enter dirname: > doesntexist
Success!
答案4
这个想法会使事情变得稍微复杂一些,但我建议更正确的方法是在脚本中利用适当的测试。一些效果:
#!/bin/bash
if [[ -n $1 ]]; then
dirname=$1
fi
if [[ -z $dirname ]]; then
echo "Enter directory name."
read dirname
fi
check() {
if [[ -d "$dirname" ]]; then
echo "Directory already exists."
echo "Enter new directory name."
read dirname
check
elif [[ -e "$dirname" ]]; then
echo "$dirname already exists, but is not a directory."
echo "Enter new directory name."
read dirname
check
else
if mkdir -p -- "$dirname"; then
echo "Directory created"
ls -ld "$dirname"
fi
exit
fi
}
check
这将保留您进行的调用 (mkdir) 中的错误消息,并执行一些有用的测试以提供有关尝试失败原因的反馈。此外,您可以选择将所需的目录名称作为命令行参数传递,并且它只会要求您在第二次尝试时输入它。