如果变量小于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
答案 0 :(得分:48)
您可以用以下内容替换整个地段:
for i in 0{1..9} {10..31} ; do
mkdir $path/02.$i.2011
done
虽然仍然不必启动任何外部进程(除了循环体中可能的内容)。
这可能不是那么重要的 here ,因为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
为前缀,以强制每个术语具有相同的宽度。当bash
或pax$ for i in {07..11} ; do echo $i ; done 07 08 09 10 11
以零开头时,shell会尝试强制所有生成的术语包含相同数量的数字,必要时填充零填充。
所以,在我的Debian 6框中,{{1}}版本4.1.5:
{{1}}
答案 1 :(得分:20)
您可以使用
$(printf %02d $i)
使用您想要的格式生成数字。
for i in $(seq 0 1 31)
do
mkdir $path/02.$(printf %02d $i).2011
done
答案 2 :(得分:12)
更好:
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
答案 3 :(得分:4)
在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
答案 4 :(得分:3)
这对你有用吗?
zeroes="0000000"
pad=$zeroes$i
echo ${pad:(-2)}
答案 5 :(得分: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
答案 6 :(得分:0)
你的if / then声明是倒退的。您在10以上时添加0,在低于10时不添加。
另一个错误是你的截止值严格大于10,不包括10,即使10是两位数。
答案 7 :(得分:0)
path=/tmp
ruby -rfileutils -e '1.upto(31){|x| FileUtils.mkdir "'$path'/02.%02d.2011" % x}'
答案 8 :(得分:0)
这是我为脚本做的,我要求一天,天数,正则表达式等,默认为paxdiablo共享的改进的正则表达式。
for day in $days
do if [ 1 -eq "${#day}"] ; then
day="0$day"
fi
我只是在循环开始时运行这个,我在当天运行一堆日志分析,埋在带有前导零的目录中。
答案 9 :(得分:0)
我创建了这个简单的实用程序来执行此操作,祝你好运,希望这有助于堆叠!
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