添加零到单个数字变量

时间:2011-02-24 00:39:17

标签: bash unix variables directory

如果变量小于10,则尝试在变量前添加零并创建所述目录。我似乎无法正确添加零。继续制作02.1.201102.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

10 个答案:

答案 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]}形式,其中xy是整数或单个字符,incr是可选的增量,是整数。提供整数时,表达式会扩展到xy之间的每个数字,包括0x。提供的整数可以以y为前缀,以强制每个术语具有相同的宽度。当bashpax$ 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