linux - 检查命令是否在 bash 中的 if 中执行

标签 linux bash shell if-statement mkdir

我是 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 进行阅读提示。
  • 使用各种列表运算符,您会经常看到它们。
  • 了解如何通过continuebreak 控制循环。使用这样的循环来确保输入正确的参数并不罕见。

关于linux - 检查命令是否在 bash 中的 if 中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27650216/

相关文章:

linux - 如何使用 NASM Assembly 忽略输入中的换行符?

c - 'less' linux 命令的备用程序/使 'less' 安全

bash - 在 bash 中处理一行带分隔符的数字

json - 如何使用 pig 将下面的元组集转换为格式化的 json?

linux - 将 "read"用于变量中未知数量的输入

linux - 在不同的脚本/终端中使用 wlan0 或 eth0

linux - 无法通过 wget 传递变量内带有引号的变量

linux - 使用 find 和 sed 将文件名插入文件

linux - 如何使用/dev/null 进行 bash 命令

macos - 如何在 Mac OS 上查找超过 42 个字符的文件名