你好,這裡只是一個菜鳥愛好者,所以希望這不是一個太簡單的問題。
我正在嘗試編寫一個腳本,讓我僅使用用戶輸入即可為我的媒體生成整個文件結構。除了 '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