Bash-在while循环中将零添加到个位数之前

Bash-在while循环中将零添加到个位数之前

我写了这个脚本 exif_脚本 并想将 ep 变量更改为两位数,例如 01 而不是 1。

#!/bin/bash
x=0
ep=1
while [ $x -le 11 ]
do
  echo "Welcome $x times"
  date --date="$x week" +"%Y:%m:%d"
  exiftool -exififd:dateTimeOriginal="$(date --date="$x week" +"%Y:%m:%d") 00" $1$ep*
  x=$(( $x + 1 ))
  ep=$(( $ep + 1 ))
done

答案1

您可以使用shell 参数扩展在数字中添加零填充。

例如,以 5 位数字格式打印数字:

$ zeroos="00000"
$ number="123"

$ temp_num="$zeroos$number"
$ echo "${temp_num:(-5)}"
00123

# Or instead of the "5" constant, use $zeroos length
$ echo "${temp_num:(-${#zeroos})}"    
00123

更新:

$number当数字变得比 更长(位数更多)时,上面的例子会截断 的最前面的数字$zeroos

$ number="1234567" # Changed to 7 digits
echo "${temp_num:(-5)}"
34567 # Resulted in a wrong number!

更安全的方法:

$ number="123"
$ echo "${zeroos:${#number}:${#zeroos}}${number}"
00123

$ number="1234567"
$ echo "${zeroos:${#number}:${#zeroos}}${number}"
1234567

注1:

稍微不同的是,使用$zeroosresp.的前几个数字$century(而不是最后几个数字),如下所示:

$ century="2000"
$ year="1"
$ echo "${century:0:-${#year}}${year}"
2001

例如,如果您有混合日期,其中年份为 1 位、2 位甚至 4 位数字,但希望它们在任何情况下都是 4 位数字,而无需条件(用于检查其实际数字)和任何算术,那么这将非常有用。
缺点是,如果${#year}大于${#century},则会导致错误。

笔记2:

使用时printf(正如其他答案所建议的那样),请注意,从大范围来看,它可能会慢得多(查看示例)。

答案2

使用您的脚本,以下操作将会起作用。

#!/bin/bash
x=0
ep=1
while [ $x -le 11 ]
do
  ep_padded=$(printf '%02d' $ep)
  echo "Welcome $x times"
  date --date="$x week" +"%Y:%m:%d"
  exiftool -exififd:dateTimeOriginal="$(date --date="$x week" +"%Y:%m:%d") 00" $1$ep_padded*
  x=$(( $x + 1 ))
  ep=$(( $ep + 1 ))
done

您也可以使用以下形式来增加变量

x=$((++x))
ep=$((++ep))

答案3

如下所示设置您的变量,这将添加一个填充零,您可以根据自己的期望添加更多零。

ep="$(printf '%02d' $((++ep)) )"

相关内容