Bash-在连接到字符串顺序字符串之前,先剥离并向数字添加前导零

Bash-在连接到字符串顺序字符串之前,先剥离并向数字添加前导零,bash,syntax-error,Bash,Syntax Error,我需要自动化备份解决方案,该解决方案将文件存储在诸如YYYYMMDD.nn之类的文件夹中。 每天很少有文件会像这样备份,因此生成的文件夹名称可能是20141002.01、20141002.2。。。20141002.10. 我当前的脚本适用于YYYYMMDD.n,但当n大于9时,排序和拾取最后一个文件夹不起作用,因为20141002.10高于20141002.9,hens将切换到YYYYMMDD.nn格式,并采用分离nn、剥离前导零、递增和添加前导零(如果需要)的方法。 我有一个功能,可以检查最后

我需要自动化备份解决方案,该解决方案将文件存储在诸如YYYYMMDD.nn之类的文件夹中。 每天很少有文件会像这样备份,因此生成的文件夹名称可能是20141002.01、20141002.2。。。20141002.10. 我当前的脚本适用于YYYYMMDD.n,但当n大于9时,排序和拾取最后一个文件夹不起作用,因为20141002.10高于20141002.9,hens将切换到YYYYMMDD.nn格式,并采用分离nn、剥离前导零、递增和添加前导零(如果需要)的方法。 我有一个功能,可以检查最后一个文件夹中的今天日期,并创建下一个文件夹

createNextProcessedFolder() {
      local LastFolderName=`ls -1 ${ProcessedListsDir} | grep ${CurrentDate} | tail -n 1`
      n=`echo ${LastFolderName} | sed -r 's/^.{9}//'`
      n="$((10#$n))"
      nextFolderName=${CurrentDate}.$((if[[ $(( ${n}+1 )) < 10 ]];then n="0$((${n}+1))";else n="$(( ${n}+1 ))"; fi))
      mkdir ${ProcessedListsDir}/${nextFolderName}
      if [[ -d ${ProcessedListsDir}/${nextFolderName}  ]]
      then
          echo "New folder ${nextFolderName} was created"
      else
          echo "Error: ${nextFolderName} was not created"
      fi
      Location="${ProcessedListsDir}/${nextFolderName}"
}
createNextProcessedFolder(){
本地LastFolderName=`ls-1${ProcessedListsDir}| grep${CurrentDate}| tail-n1`
n=`echo${LastFolderName}| sed-r's/^.{9}/'`
n=“$((10#$n))”
nextFolderName=${CurrentDate}.$(如果[$(${n}+1))<10];那么n=“0$(${n}+1”);否则n=“$(${n}+1”);fi))
mkdir${ProcessedListsDir}/${nextFolderName}
如果[[-d${ProcessedListsDir}/${nextFolderName}]]
然后
echo“已创建新文件夹${nextFolderName}”
其他的
echo“错误:${nextFolderName}未创建”
fi
Location=“${ProcessedListsDir}/${nextFolderName}”
}
因此,当我尝试运行此操作时,会出现如下错误:

line 21: if[[ 1 < 10 ]];then n="01";else n="1"; fi: syntax error: invalid arithmetic operator (error token is ";then n="01";else n="1"; fi")
第21行:如果[[1<10]];然后n=“01”;else n=“1”;fi:语法错误:无效的算术运算符(错误标记为“then n n=“01”;else n=“1”fi”)
第21行是:

nextFolderName=${CurrentDate}.$((if[[ $(( ${n}+1 )) < 10 ]];then n="0$((${n}+1))";else n="$(( ${n}+1 ))"; fi))
nextFolderName=${CurrentDate}.$(如果[[$(${n}+1))<10]];那么n=“0$(${n}+1”);否则n=“$($(${n}+1))”;fi))
我相信在这之后会有更多的错误,但如果有人能帮我解决这个问题,我将不胜感激。

  • 不能将
    $(…)
    用于命令替换,因为它必须是
    $(…)
  • [[
    ]
    之前和之后需要空格。您还可以在BASH中使用
    (…)
试试这个:

(( (n+1) < 10 )) && n="0$((n++))" || ((n++))
nextFolderName="${CurrentDate}.${n}"
((n+1)<10))&&n=“0$((n++)”| |((n++))
nextFolderName=“${CurrentDate}.${n}”

因此,我的问题是对从前导零的字符串中提取的数字进行递增,如果小于10,则返回前导零的递增数字。我最终使用的解决方案可以用下面的脚本表示。 我想不可能比这个短

n=$1
(( ((n++)) < 10 )) && n="0$n"
echo $n
n=$1
((n++)<10))&&n=“0$n”
回声$n
我没有想到的是,我不必使用这个函数从n中去掉前导零,n++在递增时会这样做:-)
再次感谢您为我指明了正确的方向。

为了完整起见,另一个解决方案是:

n=$( printf "%02d" $n )
d
前面的
02
表示最多两位数的
0
s。或:

nextFolderName="${CurrentDate}."$( printf "%02d" "$n" )

另外,在
if
[[[
之间加空格试试这个:
if[[1<10]];然后n=“01”;否则n=“1”;fi
感谢您的快速回复,您肯定没有给我正确的答案。n+1由于某种奇怪的原因不起作用,因此只有10及以上可以与n++一起工作。尽管如此,通过您宝贵的输入,我成功地将其与下面答案中的代码一起工作。谢谢@zerodiff。我喜欢您的解决方案,因为我可以将其与任意数量的零一起使用s、 “0$n”方法仅适用于2位数字。