Bash 将零添加到一位数变量

Bash 将零添加到一位数变量,bash,unix,variables,directory,Bash,Unix,Variables,Directory,如果变量小于10,则尝试在变量前添加一个零,并创建所述目录。我似乎无法正确地将零相加。持续导致2011年1月2日,2011年2月2日等 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 您的if/then语句是反向的。当0高于10时,您

如果变量小于10,则尝试在变量前添加一个零,并创建所述目录。我似乎无法正确地将零相加。持续导致2011年1月2日,
2011年2月2日

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

您的if/then语句是反向的。当0高于10时,您添加的是0,而不是低于10时添加的


另一个错误是,您将截止值严格地设置为大于10,但不包括10,即使10是两位数。

您可以将整个批次替换为:

for day in 0{1..9} {10..31} ; do
    mkdir ${path}/02.${day}.2011
done
但仍然不必启动任何外部进程(循环体中可能存在的进程除外)

这在这里可能不太重要,因为
mkdir
不是您在一个紧密循环中经常做的事情之一,但是如果您在
bash
中编写了大量快速而肮脏的代码,这一点将非常重要

当您要像我的一些脚本偶尔做的那样做数十万次时,创建流程是非常昂贵的:-)

示例,以便您可以看到它的作用:

pax$ for day in 0{8..9} {10..11}; do echo ${day}; done
08
09
10
11
而且,如果您有足够新版本的
bash
,它将满足您的前导数字请求:

序列表达式的形式为
{x..y[…incr]}
,其中
x
y
为整数或单个字符,
incr
(可选增量)为整数

当提供整数时,表达式将扩展到
x
y
之间的每个数字

提供的整数可以前缀为
0
,以强制每个项具有相同的宽度。当
x
y
以零开头时,shell将尝试强制所有生成的术语包含相同的位数,必要时进行零填充

因此,在我的Debian 6框中,使用
bash
4.1.5版:

pax$ for day in {08..11} ; do echo ${day} ; done
08
09
10
11
更好:

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
你可以用

$(printf %02d $i)
以生成所需格式的数字

for i in $(seq 0 1 31)
do
    mkdir $path/02.$(printf %02d $i).2011
done

这对你有用吗

zeroes="0000000"
pad=$zeroes$i
echo ${pad:(-2)}

在Bash 4中,如果您要求大括号范围展开,大括号范围展开将给出前导零:

for i in {01..31}
不需要做任何其他事情

如果您使用的是早期版本的Bash(或4),则无需使用外部实用程序,如
seq

for i in {1..31}

您还可以执行以下操作:

z='0'
mkdir "$path/02.${z: -${#i}}$i.2011"
使用paxdiablo的建议,您可以一次创建所有目录,而无需循环:

mkdir "$path"/02.{0{1..9},{10..31}}.2011

下面是我为一个脚本所做的,其中我要求一天、几天的范围、正则表达式等等,默认为paxdiablo共享的改进正则表达式

for day in $days
    do if [ 1 -eq "${#day}"] ; then
        day="0$day"
    fi

我只是在我的循环开始时运行了这个,我在讨论中的那天运行了一系列日志分析,这些日志分析被隐藏在带有前导零的目录中。

我创建了这个简单的实用程序来执行这个操作,祝你好运,希望这对堆栈者有所帮助

$ seq --version | head -1
seq (GNU coreutils) 8.21
$ seq -f "%02g" 1 10
01
02
03
04
05
06
07
08
09
10
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

我忘了seq。但我想,只要
seq 31
就行了。OP不需要0,而
first
increment
的默认值都是1。
seq-w
生成带前导零的数字。很好,它很容易集成到旧的echo语句中,如
echo“this is a$var”
->
echo”this a$(printf%03d$var)
bash最新版本支持前导零的评论获得奖励!出于某种原因,通过macports安装的bash 5.0.7不支持以0作为前缀。但是指定多个非连续的增量是令人惊讶的。可能的重复请参见如何使用参数展开来归零填充:在大括号中添加另一个数字就可以了!
for day in $days
    do if [ 1 -eq "${#day}"] ; then
        day="0$day"
    fi
$ seq --version | head -1
seq (GNU coreutils) 8.21
$ seq -f "%02g" 1 10
01
02
03
04
05
06
07
08
09
10
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