在“if”语句中执行命令,并在成功时执行进一步的步骤

在“if”语句中执行命令,并在成功时执行进一步的步骤

我试图执行一个程序,该程序将根据提示符提供的完整路径创建一个目录,如果该目录已存在,它将返回一个错误(“目录已存在”)并再次询问递归函数中的名称。

这是我尝试过的:让我们说一个文件,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) 中的错误消息,并执行一些有用的测试以提供有关尝试失败原因的反馈。此外,您可以选择将所需的目录名称作为命令行参数传递,并且它只会要求您在第二次尝试时输入它。

相关内容