根據使用者輸入編寫目錄和子目錄建立腳本

根據使用者輸入編寫目錄和子目錄建立腳本

你好,這裡只是一個菜鳥愛好者,所以希望這不是一個太簡單的問題。

我正在嘗試編寫一個腳本,讓我僅使用用戶輸入即可為我的媒體生成整個文件結構。除了 'mkdir Season{1..$user_input4} 所在的第 20 行,我一切正常。我希望它接受用戶 input_4 並創建 1 + 那麼多目錄,但我覺得我可能從錯誤的角度看待這個問題,因為它創建了一個名為 Season{1..(prints the user input)} 的子目錄。

#!/bin/bash
file_created="Directory Created"
directory_number=0
echo "How many directories should be created?"
read user_input
while [ $directory_number -ne $user_input ]
do 
    echo "Enter Directory Name"
    read user_input2 
        mkdir $user_input2
    directory_number=$((directory_number + 1))
echo "Do you want to create Seasons? Y/N"
    read user_input3
    if [ $user_input3 == "Y" ]
    then
        echo "Enter number of seasons"
            read user_input4
        cd $user_input2/
        mkdir Season{1..$user_input4}
        cd ..
    else
    :
    fi
done

如果有人有任何想法,他們將不勝感激。謝謝!

答案1

這種方式行不通,因為:

擴展的順序是:大括號擴展;波形符擴充、參數和變數擴充,(……)。
[man bash,突出顯示添加]

大括號擴展發生在變數擴展之前,只能看到{1..$user_input4},這當然是無效的。

另一個可能的問題:如果$user_input4碰巧非常大,那麼你會得到一個很長您可能超出的目錄名稱列表外殼的ARG_MAX極限,這將使命令失敗。您可以使用它seq來建立編號規則,printf建立以零分隔的參數列表,並根據需要經常xargs呼叫來解決該問題。mkdir當然,使用較少數量的參數也是可以的,所以如果你要處理未知數量和討厭的惡意用戶,這就是你要走的路:

printf 'Season%s\0' $(seq 1 $user_input4) | xargs -0 mkdir

如果您希望數列以$user_input4+1結束,只需將變數替換為算術表達式$((user_input4 + 1)),例如:

printf 'Season%s\0' $(seq 1 $((user_input4 + 1))) | xargs -0 mkdir

答案2

據我所知, mkdir 不接受一系列目錄,至少不接受您嘗試使用它的格式。你幾乎就像一個數組一樣創建季節。但是,如果您想要使用 mkdir 指令建立多個目錄,則必須一次傳遞一個目錄,並在它們之間留有空格。

由於您接受 user_input4 中的數值,因此您可以嘗試使用 while 迴圈從 user_input4 的值開始倒數計時,直到達到零。

while [ $user_input4 -gt 0 ]
do
  mkdir Season${user_input4}
  let user_input4=${user_input4}-1
done

當 user_input4 等於 0 時,迴圈自然會停止。或者,如果您需要比該數字多一的值,只需使用 -ge(大於或等於)。此方法的唯一問題是它將以相反的順序建立目錄。因此,如果 user_input4 為“3”,則順序為:

mkdir Season3
mkdir Season2
mkdir Season1

相關內容