Bash 用于增量扩展的Unix shell脚本
每次脚本在工作目录中运行时,我都会生成一个文件(testfile)。我必须将生成的文件复制到一个目录(testfolder)中,并使其以.ext递增 如果脚本是第一次运行,则将testfile作为“testfile.0”复制到testfolder,第二次运行时将testfile作为“testfile.1”复制到testfolder,依此类推 我的剧本: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
#!/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
的修改无法按预期工作
通常,您可以使用withwhile
来避免此问题,但在本例中,一个简单的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
的修改无法按预期工作
通常,您可以使用withwhile
来避免此问题,但在本例中,一个简单的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:作为回报,你指出了新语法$(…)
,所以多亏了你,我对这个主题了解了很多!