将零添加到单个数字variables

试图在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]} ,其中xy可以是整数或单个字符, incr (可选的增量)是整数。 当提供整数时,表达式将扩展到xy之间的每个数字(包含)。 提供的整数可以加前缀0以强制每个项具有相同的宽度。 当xy以零开始时,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