如何将"if"和"while loop"语句组合在一起?



shell脚本的新手,我想测试一下我创建的变量是否是有效的目录,如果没有,则让用户进入while循环以进入目录,并且仅在输入有效目录时允许退出。

到目前为止,这是我的脚本的样子:

~/bin/bash
source_dir="$1"
dest_dir="$2"
mkdir /#HOME/$source_dir
mkdir /#HOME$dest_dir

if [ -d  "$source_dir" ]
then
echo "$source_dir is a valid directory"
fi
while [[ ! -d "$source_dir" ]]
do
echo "Please enter a valid directory"
read source_dir
done

有没有办法将它们合并到一个语句中?

如果目录有效,则while代码将永远不会执行。 因此,只需在循环后移动echo "$source_dir is a valid directory"

#!/bin/bash
source_dir="$1"
dest_dir="$2"
mkdir "$HOME/$source_dir"
mkdir "$HOME/$dest_dir"
until [[ -d "$source_dir" ]]
do
read -p "Please enter a valid directory" source_dir
done
echo "$source_dir is a valid directory"

笔记:

  • 修复了一些代码拼写错误,例如/#HOME$dest_dir应该是"$HOME/$dest_dir".

  • 任何while !都可以缩短为until.

上面的代码缺少一些东西:

  • 它尝试创建一个新的目录,如果失败,则让用户输入已经存在的目录。 最好让用户创建一个新目录,但前提是该目录尚不存在。

  • 最好检查$dest_dir是否存在。

以下是使用 shell 函数的更彻底的方法:

#!/bin/bash
untilmkdir () 
{ 
d="$1";
until mkdir "$d" ; do
read -p "Please enter a valid directory: " d
[ -d "$d" ] && break
done;
echo "$d is a valid directory" 1>&2
echo "$d"
}
source_dir=$(untilmkdir "$HOME/$1")
dest_dir=$(untilmkdir "$HOME/$2")

笔记:

  • untilmkdir中的提示将打印到stderr
  • untilmkdir创建的任何目录的名称都将打印到stdout
  • untilmkdir打印到stderrstdout允许将成功创建的名称存储到变量中。

最新更新