添加零到单个数字变量

Col*_*lby 24 unix directory variables bash

如果小于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
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 53

您可以用以下内容替换整个批次:

for i in 0{1..9} {10..31} ; do
    mkdir $path/02.$i.2011
done
Run Code Online (Sandbox Code Playgroud)

同时仍然不必启动任何外部进程(除了可能在循环体中的内容).

这可能不是那么重要,因为mkdir这不是你在紧密循环中做很多事情的事情之一,但如果你写了很多快速而肮脏的代码,这是很重要的bash.

由于我的一些脚本偶尔会完成数十万次,因此创建进程的成本很高:-)

示例,以便您可以看到它的运行情况:

pax$ for i in 0{7..9} {10..12}; do echo $i; done
07
08
09
10
11
12
Run Code Online (Sandbox Code Playgroud)

而且,如果你有一个最近足够的版本bash,它将遵守你的领先数字请求:

序列表达式采用形式{x..y[..incr]},其中xy是整数或单个字符,incr可选的增量是整数.提供整数时,表达式将扩展为介于x和之间的每个数字y.提供的整数可以加上前缀,0以强制每个术语具有相同的宽度.当任何一个xy以零开始时,shell会尝试强制所有生成的术语包含相同数量的数字,必要时填充零.

所以,在我的Debian 6盒子上,bash版本4.1.5:

pax$ for i in {07..11} ; do echo $i ; done
07
08
09
10
11
Run Code Online (Sandbox Code Playgroud)


Jes*_*hen 21

您可以使用

$(printf %02d $i)
Run Code Online (Sandbox Code Playgroud)

用您想要的格式生成数字.

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

  • `seq -w`生成带前导零的数字. (5认同)

Jul*_*ano 13

更好:

for i in $(seq -f %02g 1 31)
do
    mkdir "$path/02.$i.2011"
done
Run Code Online (Sandbox Code Playgroud)

甚至:

for i in {01..31}
do
    mkdir "$path/02.$(printf "%02d" $i).2011"
done
Run Code Online (Sandbox Code Playgroud)


Pau*_*ce. 5

在 Bash 4 中,如果您要求,括号范围扩展将为您提供前导零:

for i in {01..31}
Run Code Online (Sandbox Code Playgroud)

无需做任何其他事情。

如果您使用的是较早版本的 Bash(或 4,就此而言),则无需使用外部实用程序,例如seq

for i in {1..31}
Run Code Online (Sandbox Code Playgroud)

或者

for ((i=1; i<=31; i++))
Run Code Online (Sandbox Code Playgroud)

与其中任何一个:

mkdir "$path/02.$(printf '%02d' "$i").2011"
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

z='0'
mkdir "$path/02.${z: -${#i}}$i.2011"
Run Code Online (Sandbox Code Playgroud)

使用 paxdiablo 的建议,您可以一次创建所有目录而无需循环

mkdir "$path"/02.{0{1..9},{10..31}}.2011
Run Code Online (Sandbox Code Playgroud)


Kev*_*lan 0

你的 if/then 语句是倒退的。当大于 10 时加 0,小于 10 时不加 1。

另一个错误是您将截止值严格大于 10,其中不包括 10,即使 10 是两位数。