Bash 用于增量扩展的Unix shell脚本

Bash 用于增量扩展的Unix shell脚本,bash,shell,unix,loops,while-loop,Bash,Shell,Unix,Loops,While Loop,每次脚本在工作目录中运行时,我都会生成一个文件(testfile)。我必须将生成的文件复制到一个目录(testfolder)中,并使其以.ext递增 如果脚本是第一次运行,则将testfile作为“testfile.0”复制到testfolder,第二次运行时将testfile作为“testfile.1”复制到testfolder,依此类推 我的剧本: #!/bin/sh file="testfile" n=1 ls folder/${file}* | while read i do i

每次脚本在工作目录中运行时,我都会生成一个文件(testfile)。我必须将生成的文件复制到一个目录(testfolder)中,并使其以.ext递增

如果脚本是第一次运行,则将testfile作为“testfile.0”复制到testfolder,第二次运行时将testfile作为“testfile.1”复制到testfolder,依此类推

我的剧本:

#!/bin/sh

file="testfile"
n=1

ls folder/${file}* | while read i
do
  if [ folder/${file}.${n} = ${i} ]
  then
   n=$(( $n + 1 ))
 fi
 done

 cp testfile folder/${file}.${n}

这仅适用于第一个增量“folder/testfile.0”

问题在于,由于使用管道,您的
while
循环在子shell中执行,因此您对
n
的修改无法按预期工作

通常,您可以使用with
while
来避免此问题,但在本例中,一个简单的
for
循环是正确的方法:

#!/bin/sh

file="testfile"
n=1

for i in folder/${file}*
do
  if [ folder/${file}.${n} = ${i} ]
  then
   n=$(( $n + 1 ))
 fi
done

cp testfile folder/${file}.${n}

问题是由于使用了管道,
while
循环在子shell中执行,因此对
n
的修改无法按预期工作

通常,您可以使用with
while
来避免此问题,但在本例中,一个简单的
for
循环是正确的方法:

#!/bin/sh

file="testfile"
n=1

for i in folder/${file}*
do
  if [ folder/${file}.${n} = ${i} ]
  then
   n=$(( $n + 1 ))
 fi
done

cp testfile folder/${file}.${n}

我不会纠正您的解决方案,因为mklement0做得很好

下面是另一个解决方案,没有任何循环:

file="testfile"
n_max=$(ls -1 "folder/${file}"* | egrep -o '[0-9]+$' | sort -rn | head -n 1)
cp "${file}" "folder/${file}.$((n_max+1))"
下面是第二行的内容:首先列出文件,然后
egrep
提取数字扩展名,然后
sort-rg
按递减顺序对它们进行排序,最后
head
只捕获第一行,即使用的最大索引。最后,在第三行中,向这个max添加一个来构建新索引。如果列表为空,则在我的脚本上没有问题


顺便说一下,列出一个目录可能很长,所以我建议您将最后使用的索引存储在某个地方,以备将来使用。将其另存为脚本中的变量,甚至保存在文件中。。。它还可以为您节省一些时间。

我不会纠正您的解决方案,因为mklement0做得很好

下面是另一个解决方案,没有任何循环:

file="testfile"
n_max=$(ls -1 "folder/${file}"* | egrep -o '[0-9]+$' | sort -rn | head -n 1)
cp "${file}" "folder/${file}.$((n_max+1))"
下面是第二行的内容:首先列出文件,然后
egrep
提取数字扩展名,然后
sort-rg
按递减顺序对它们进行排序,最后
head
只捕获第一行,即使用的最大索引。最后,在第三行中,向这个max添加一个来构建新索引。如果列表为空,则在我的脚本上没有问题


顺便说一下,列出一个目录可能很长,所以我建议您将最后使用的索引存储在某个地方,以备将来使用。将其另存为脚本中的变量,甚至保存在文件中。。。它还可以为您节省一些时间。

这只是另一个建议-在易于理解的代码中:

#!/bin/bash

file="testfile"
n=1

# Check for existing files with filename and count it
n=$(ls -latr folder/ |grep -i ${file} | wc -l)

# Increment above number
n=$(( $n + 1 ))

# Copy over file with the incremented number
cp $file folder/${file}.${n}

只是另一个建议-在易于理解的代码中:

#!/bin/bash

file="testfile"
n=1

# Check for existing files with filename and count it
n=$(ls -latr folder/ |grep -i ${file} | wc -l)

# Increment above number
n=$(( $n + 1 ))

# Copy over file with the incremented number
cp $file folder/${file}.${n}

做得好;请删除第二行
=
周围的空格,好吗?他们违反了命令。一个诡辩:算术表达式的
$[]
语法显然已被弃用(请参阅);因此,
$((n_max+1))
也是更安全的选择:如果您在排序时处理整数的字符串表示,
-n
-数值排序
)显然比
-g
-通用数值排序
)-请参阅@mkelement0:非常感谢您的宝贵意见,改变完成了,我很乐意。您的解决方案是OP方法的最佳替代方案;这促使我研究了
$[]
结构(我以前从未见过)以及
排序
-n
-g
选项之间的区别。@mkelement0:作为回报,你指出了新语法
$(…)
,所以多亏了你,我对这个主题了解了很多!做得好;请删除第二行
=
周围的空格,好吗?他们违反了命令。一个诡辩:算术表达式的
$[]
语法显然已被弃用(请参阅);因此,
$((n_max+1))
也是更安全的选择:如果您在排序时处理整数的字符串表示,
-n
-数值排序
)显然比
-g
-通用数值排序
)-请参阅@mkelement0:非常感谢您的宝贵意见,改变完成了,我很乐意。您的解决方案是OP方法的最佳替代方案;这促使我研究了
$[]
结构(我以前从未见过)以及
排序
-n
-g
选项之间的区别。@mkelement0:作为回报,你指出了新语法
$(…)
,所以多亏了你,我对这个主题了解了很多!