Bash 将零添加到一位数变量
如果变量小于10,则尝试在变量前添加一个零,并创建所述目录。我似乎无法正确地将零相加。持续导致2011年1月2日,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时,您
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