Col*_*lby 24 unix directory variables bash
如果小于10,则尝试在变量之前添加零并创建所述目录.我似乎无法正确添加零.不断导致制作02.1.2011,02.2.2011等等,等等.
i=0
for i in {01..31}
do
if $i > 10
then
mkdir $path/02.0$i.2011
else
mkdir $path/02.$i.2011
fi
done
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 53
您可以用以下内容替换整个批次:
for i in 0{1..9} {10..31} ; do
mkdir $path/02.$i.2011
done
Run Code Online (Sandbox Code Playgroud)
同时仍然不必启动任何外部进程(除了可能在循环体中的内容).
这可能不是那么重要,因为mkdir这不是你在紧密循环中做很多事情的事情之一,但如果你写了很多快速而肮脏的代码,这将是很重要的bash.
由于我的一些脚本偶尔会完成数十万次,因此创建进程的成本很高:-)
示例,以便您可以看到它的运行情况:
pax$ for i in 0{7..9} {10..12}; do echo $i; done
07
08
09
10
11
12
Run Code Online (Sandbox Code Playgroud)
而且,如果你有一个最近足够的版本bash,它将遵守你的领先数字请求:
序列表达式采用形式
{x..y[..incr]},其中x和y是整数或单个字符,incr可选的增量是整数.提供整数时,表达式将扩展为介于x和之间的每个数字y.提供的整数可以加上前缀,0以强制每个术语具有相同的宽度.当任何一个x或y以零开始时,shell会尝试强制所有生成的术语包含相同数量的数字,必要时填充零.
所以,在我的Debian 6盒子上,bash版本4.1.5:
pax$ for i in {07..11} ; do echo $i ; done
07
08
09
10
11
Run Code Online (Sandbox Code Playgroud)
Jes*_*hen 21
您可以使用
$(printf %02d $i)
Run Code Online (Sandbox Code Playgroud)
用您想要的格式生成数字.
for i in $(seq 0 1 31)
do
mkdir $path/02.$(printf %02d $i).2011
done
Run Code Online (Sandbox Code Playgroud)
Jul*_*ano 13
更好:
for i in $(seq -f %02g 1 31)
do
mkdir "$path/02.$i.2011"
done
Run Code Online (Sandbox Code Playgroud)
甚至:
for i in {01..31}
do
mkdir "$path/02.$(printf "%02d" $i).2011"
done
Run Code Online (Sandbox Code Playgroud)
在 Bash 4 中,如果您要求,括号范围扩展将为您提供前导零:
for i in {01..31}
Run Code Online (Sandbox Code Playgroud)
无需做任何其他事情。
如果您使用的是较早版本的 Bash(或 4,就此而言),则无需使用外部实用程序,例如seq:
for i in {1..31}
Run Code Online (Sandbox Code Playgroud)
或者
for ((i=1; i<=31; i++))
Run Code Online (Sandbox Code Playgroud)
与其中任何一个:
mkdir "$path/02.$(printf '%02d' "$i").2011"
Run Code Online (Sandbox Code Playgroud)
你也可以这样做:
z='0'
mkdir "$path/02.${z: -${#i}}$i.2011"
Run Code Online (Sandbox Code Playgroud)
使用 paxdiablo 的建议,您可以一次创建所有目录而无需循环:
mkdir "$path"/02.{0{1..9},{10..31}}.2011
Run Code Online (Sandbox Code Playgroud)