我是 bash 编程的新手,尝试执行一个程序,该程序将根据提示提供给它的完整路径创建一个目录,如果目录已经存在,它将返回目录已存在的错误,并再次询问名称递归函数。 这就是我所做的
假设一个文件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
这里的问题是,如果该目录存在,那么程序就可以正常工作,但如果不存在,那么它会创建它,然后转到程序的其他部分。请帮忙
最佳答案
您可以使用 test查看目录是否存在。如果您想重复询问目录名称直到得到一个目录名称,请使用循环:
while true
do
read -p"Directory Name: " directory
if [[ -d $directory ]] # Directory already exists
then
echo "Directory '$directory' already exists. Try again."
continue
fi
mkdir "$directory" && break
echo "Cannot create directory $directory"
exit 2 # Or whatever
done
while true
循环是一个无限循环。但是,我在循环中有两个循环控制:返回到循环顶部的 continue
语句和结束循环的 break
语句。这就是为什么无限循环(就像所有无限循环一样)并不是真正的无限。
我使用 [[ -d "$directory"]]
来测试目录是否已经存在。如果它已经存在,我将回应一些类似的效果,并使用 continue
返回并重新提示输入目录名称。
请注意,我的read
使用了一个-p
参数。这是我用于 read
命令的提示符。这是将阅读与提示结合起来的一种非常简单的方法。
mkdir "$directory"&& break
表示创建目录。 &&
是一个列表运算符。它表示运行左侧的命令(mkdir
),如果成功(即返回零退出状态),则运行右侧的命令(break
code>) 并退出我的循环。它相当于:
If mkdir "$directory"
then
break
fi
另一个列表运算符是||
。它表示如果左侧的命令失败(返回非零退出状态),则运行右侧的命令。
例如:
[[ -d $directory ]] || mkdir "$directory"
相当于:
if [[ ! -d $directory ]]
then
mkdir "$directory"
fi
我在这里介绍了很多内容,目的是为了演示您将在各种 shell 脚本中看到的许多标准内容。
- 使用
[[ ... ]]
进行测试。有很多针对文件、目录、字符串和 bool 测试的各种测试。学习它们。 - 使用
-p
进行阅读提示。 - 使用各种列表运算符,您会经常看到它们。
- 了解如何通过
continue
和break
控制循环。使用这样的循环来确保输入正确的参数并不罕见。
关于linux - 检查命令是否在 bash 中的 if 中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27650216/