Bash - 在 while 循环中将零前置到个位数

Sol*_*ris 3 command-line bash

我制作了这个脚本 exif_script 并希望将 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
Run Code Online (Sandbox Code Playgroud)

Noa*_*nos 6

您可以使用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
Run Code Online (Sandbox Code Playgroud)

更新:

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

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

更安全的方法:

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

$ number="1234567"
$ echo "${zeroos:${#number}:${#zeroos}}${number}"
1234567
Run Code Online (Sandbox Code Playgroud)

注1:

略有不同的变体,分别使用第一个数字$zeroos$century(而不是最后一个)将是:

$ century="2000"
$ year="1"
$ echo "${century:0:-${#year}}${year}"
2001
Run Code Online (Sandbox Code Playgroud)

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

笔记2:

当使用printf(如其他答案所建议的那样)时,请注意,它在大规模上可能会变慢(参见示例)。