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
打印到stderr和stdout允许将成功创建的名称存储到变量中。