我正在尝试编写一个 Bash 脚本来自动执行一项重复性任务,即创建一个文件夹结构,其中一些文件夹应该被编号(更具体地说,这是为了将我从 DVD 转换的一些电视剧存档在一个 Kodi 媒体播放器容易理解的文件夹结构中)
第一次尝试是这样的:
echo "Insert the title of the series"
read title
mkdir $title
mkdir $title/extrafanart
mkdir $title/themes
mkdir $title/videoextras
for num in {1..3}
do
mkdir $title/"Season $num"
done
这正确地创建了以下结构,例如
Star Trek
Star Trek\extrafanart
Star Trek\Season 1
Star Trek\Season 2
Star Trek\Season 3
Star Trek\themes
Star Trek\videoextras
这正是我需要的。但是,正如您可能看到的,这个脚本有一个主要缺点:季节文件夹的总数是固定的,而不是每次运行脚本时动态选择。所以我尝试对其进行如下修改
echo "Insert the title of the series"
read title
echo "Insert the number of seasons"
read seasons
mkdir $title
mkdir $title/extrafanart
mkdir $title/themes
mkdir $title/videoextras
for num in {1..$seasons}
do
mkdir $title/"Season $num"
done
这次,结果并不完全是我所期望的,这就是我得到的
Star Trek
Star Trek\extrafanart
Star Trek\Season {1..3}
Star Trek\themes
Star Trek\videoextras
这不是我需要的。
我猜问题出在循环的第一行for
,其中括号扩展被 shell 读取为字符串而不是要计算的表达式。我说得对吗?
什么地方出了问题?我该如何修正这个脚本?
答案1
使用循环:
num=1
while [ $num -le $seasons ]; do
mkdir $title/"Season $num"
num=$[ $num + 1 ]
done
解释
我们使用 [ 测试运算符和 $[ 求值运算符(它们看起来很相似,但完全不同)。[ $num -le $seasons ]
测试 $num 是否大号或埃qual than $seasons;$[ $num + 1 ]
将 $num 的数值加一并将其分配回 $num。
有关测试运算符的信息,请help test
在您的 bash shell 中输入。求值运算符在 bash 手册中有说明(man bash
请注意,它很长)。您还可以使用它来减法、乘法、除法等。