2017-05-25 77 views
0

新建shell腳本,我想測試一下,看看是否我創建的變量是有效的目錄,如果沒有用戶發送到while循環進入目錄,只允許出口輸入一個有效的目錄時。如何將「if」和「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

沒有什麼錯你的方法。不過,如果您將* if *的else分支內的*移動*,我會認爲您的代碼的意圖更易於理解。然而,這是編程風格的一般問題,並且與shell腳本無關。 – user1934428

回答

2

while code will never如果目錄有效,則執行。因此只要將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

下面是一個使用殼功能的更徹底的方法:

#!/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創建打印到標準輸出名稱。
  • 已將untilmkdir打印到stderr標準輸出允許將成功創建的名稱存儲到變量中。
+0

我認爲這是重點。如果目錄已經存在,循環**應該不會被執行。 – user1934428

+0

@ user1934428,'!mkdir foo'只在* foo *不存在的情況下返回* true *,因此除非需要循環,否則循環從不執行。在這裏,錯誤的「if」和錯誤的「while」在功能上是等同的。 – agc

+0

鮮爲人知的事實:有一個由POSIX定義的「直到」循環。 '直到mkdir「$ HOME/$ source_dir」2>/dev/null;做' – chepner