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
有没有办法将这些组合成一个声明?
答案 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 。untilmkdir
打印,可以将成功创建的名称存储到变量中。