试图在variables之前添加一个零,如果它小于10,并创build所述目录。 我似乎无法得到正确添加零。 保留导致制作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
你可以用下面的代码替换整个批次:
for i in 0{1..9} {10..31} ; do mkdir $path/02.$i.2011 done
同时还不必启动任何外部进程(除了循环体中的内容)。
这可能不是那么重要,因为mkdir
并不是你在紧密的循环中做的很多事情之一,但是如果你在bash
写了很多快速和脏的代码,这将是非常重要的。
过程创造是昂贵的,当你做了几十万次,因为我的一些脚本有时会做:-)
例如,你可以看到它的行动:
pax$ for i in 0{7..9} {10..12}; do echo $i; done 07 08 09 10 11 12
而且,如果你有一个最新版本的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
您可以使用
$(printf %02d $i)
用你想要的格式生成数字。
for i in $(seq 0 1 31) do mkdir $path/02.$(printf %02d $i).2011 done
更好:
for i in $(seq -f %02g 1 31) do mkdir "$path/02.$i.2011" done
甚至:
for i in {01..31} do mkdir "$path/02.$(printf "%02d" $i).2011" done
在Bash 4中,如果你问他们,大括号扩展会给你前导零:
for i in {01..31}
而无需做任何事情。
如果你使用的是早期版本的Bash(或者说4),那么就不需要使用seq
这样的外部工具:
for i in {1..31}
要么
for ((i=1; i<=31; i++))
与其中任何一个:
mkdir "$path/02.$(printf '%02d' "$i").2011"
你也可以这样做:
z='0' mkdir "$path/02.${z: -${#i}}$i.2011"
使用paxdiablo的建议,你可以在没有循环的情况下一次制作所有的目录:
mkdir "$path"/02.{0{1..9},{10..31}}.2011
这会为你工作吗?
zeroes="0000000" pad=$zeroes$i echo ${pad:(-2)}
$ seq --version | head -1 seq (GNU coreutils) 8.21 $ seq -f "%02g" 1 10 01 02 03 04 05 06 07 08 09 10
你的if / then语句是倒退的。 当它在10以上时加一个0,当它在下面时不加1。
另外一个缺点是,即使10是两位数,严格地说大于10的值也不包括10。
path=/tmp ruby -rfileutils -e '1.upto(31){|x| FileUtils.mkdir "'$path'/02.%02d.2011" % x}'
这是我为一个脚本所做的,我要求一天,一天的时间,正则表达式等,默认情况下是由paxdiablo共享的改进的正则表达式。
for day in $days do if [ 1 -eq "${#day}"] ; then day="0$day" fi
我只是在循环开始处运行这个操作,在那天我运行了一堆日志分析,埋在了前导零的目录中。
我创建了这个简单的实用程序来执行此操作,祝您好运,希望这有助于stackers!
for i in {1..24} do charcount=`echo $i|wc -m` count=`expr $charcount - 1` if [ $count -lt 2 ]; then i="0`echo $i`" fi echo "$i" done