如何组合" if"和#34; while循环"一起声明?

时间:2017-05-25 03:12:16

标签: bash shell if-statement 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

有没有办法将这些组合成一个声明?

1 个答案:

答案 0 :(得分:2)

如果目录有效,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

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

  • 尝试创建 new 目录,如果失败,则让用户输入已经的现有目录。让用户创建一个新目录可能会更好,但前提是它还不存在。

  • 最好检查$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
  • 对{em> stderr 和 stdout 进行untilmkdir打印,可以将成功创建的名称存储到变量中。