您好,我只是一名新手爱好者,所以希望这个问题不是太简单。
我正在尝试编写一个脚本,该脚本将允许我仅使用用户输入来为我的媒体生成整个文件结构。除了第 20 行“mkdir Season{1..$user_input4}”之外,其他一切都运行正常。我希望它接受用户 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
如果希望数字序列以 +1 结束$user_input4
,只需用算术表达式替换变量$((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 等于零时,循环将自然停止。或者,如果您需要比数字大一,只需使用 -ge(大于或等于)。此方法的唯一缺点是它将以相反的顺序创建目录。因此,如果 user_input4 为“3”,则顺序将是:
mkdir Season3
mkdir Season2
mkdir Season1