2014-04-07 141 views
4

我想輸入一個目錄的名稱並檢查它是否存在。 如果它不存在,我想創建,但我得到的錯誤mkdir: cannot create directory'./' File existsShell腳本 - 使目錄不存在

我的代碼說,該文件存在,即使它沒有。我究竟做錯了什麼?

echo "Enter directory name" 
read dirname 

if [[ ! -d "$dirname" ]] 
then 
    if [ -L $dirname] 
then 
    echo "File doesn't exist. Creating now" 
    mkdir ./$dirname 
    echo "File created" 
    else 
     echo "File exists" 
    fi 
fi 
+0

爲什麼'mkdir ./$ dirname'而不僅僅是'mkdir'$ dirname「'? – fedorqui

+0

當我離開./它說不能創建 - 沒有這樣的文件或目錄 – Pizzaman

+0

嘗試引用,也許你有一些空間,它正在嘗試做'mkdir ./ your_dir'而不是'mkdir。/ your_dir'。所以你應該單獨使用'mkdir「$ dirname」'。 – fedorqui

回答

6
if [ -L $dirname] 

看該生產線生產的錯誤消息:「[:缺少`] ''或者其他的(取決於你使用的是哪個shell)。你需要在括號內有一個空格。除非使用雙括號,否則還需要在變量擴展周圍使用雙引號;您可以使用learn the rules或使用簡單規則:始終使用雙引號圍繞變量替換和命令替換 - "$foo""$(foo)"

if [ -L "$dirname" ] 

然後出現邏輯錯誤:只有當存在不指向目錄的符號鏈接時才創建目錄。你大概是想在那裏否定一下。

不要忘記,腳本運行時可能會創建該目錄,因此您的檢查可能會顯示該目錄不存在,但當您嘗試創建它時該目錄將存在。 Never do 「check then do」, always do 「do and catch failure」

創建一個目錄,如果不存在,正確的做法是

mkdir -p -- "$dirname" 

(雙引號的情況下,$dirname包含空格或的通配符,萬一--它開始與-。)

0
read -p "Enter Directory Name: " dirname 
if [[ ! -d "$dirname" ]] 
then 
     if [[ ! -L $dirname ]] 
     then 
       echo "Directory doesn't exist. Creating now" 
       mkdir $dirname 
       echo "Directory created" 
     else 
       echo "Directory exists" 
     fi 
fi 
1

嘗試此代碼:

echo "Enter directory name" 
read dirname 

if [ ! -d "$dirname" ] 
then 
    echo "File doesn't exist. Creating now" 
    mkdir ./$dirname 
    echo "File created" 
else 
    echo "File exists" 
fi 

輸出日誌:

Chitta:~/cpp/shell$ ls 
dir.sh 

Chitta:~/cpp/shell$ sh dir.sh 
Enter directory name 
New1 
File doesn't exist. Creating now 
File created 

chitta:~/cpp/shell$ ls 
New1 dir.sh 

Chitta:~/cpp/shell$ sh dir.sh 
Enter directory name 
New1 
File exists 

Chitta:~/cpp/shell$ sh dir.sh 
Enter directory name 
New2 
File doesn't exist. Creating now 
File created 

Chitta:~/cpp/shell$ ls 
New1 New2 dir.sh 
1

試試這個:ls yourdir 2>/dev/null||mkdir yourdir,這是微小和簡潔,並履行您的任務。

+0

請添加一些更詳細的信息,爲什麼這種方法更好..目前這可能是一個評論。 – Jayan

+0

這裏的想法是檢查你是否能夠「目錄」。如果該目錄不存在,'ls'命令將返回一個非零的退出代碼,從而調用'||'子句右側的命令。如果該目錄已經存在,那麼'ls'命令將返回'0' - 真 - 只有'||'的左手邊將被評估 – Steen