![循环遍历具有特定匹配编号的文件](https://linux22.com/image/150336/%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E5%8C%B9%E9%85%8D%E7%BC%96%E5%8F%B7%E7%9A%84%E6%96%87%E4%BB%B6.png)
我正在使用 Bash 脚本,并且有两个输入数字。为简单起见,假设第一个变量称为 Start,第二个变量称为 Stop,每个变量都可以是 1000 到 2000 之间的数字。
我的文件是通过与每个数字的开头两位数字匹配的名称排列的。例如,一个文件名为:
/path/to/files11,这是与 1100 到 1199 之间(含)之间的任何数字对应的文件
现在,给定 Stop 和 Start,我想使用一个循环,按以下方式将正确的文件设置为字符串:如果 Start = 1923 且 Stop = 2267,那么我想执行以下操作(伪代码):
MyVariable =“/path/to/files19;/path/to/files20;/path/to/files21;/path/to/files22”
但我希望能够对我范围内的任何数字执行此操作。
关于如何根据前两位数字选择正确的开始和停止文件并循环数字以获得正确的字符串有什么建议吗?
答案1
使用bash
尝试:
Start=1923
Stop=2267
MyVar=
for ((i=Start/100; i<=Stop/100; i++)); do
MyVar="$MyVar;/path/to/files$i"
done
MyVar=${MyVar:1}
echo "$MyVar"
上述echo
语句产生:
/path/to/files19;/path/to/files20;/path/to/files21;/path/to/files22
怎么运行的:
MyVar=
这确保变量
MyVar
为空。for ((i=Start/100; i<=Stop/100; i++)); do
这将启动变量的循环
i
。MyVar="$MyVar;/path/to/files$i"
MyVar
这会在每次运行循环时附加一个字符串。done
这标志着循环的结束。
MyVar=${MyVar:1}
这会从字符串开头删除不需要的分号。
echo "$MyVar"
这将显示结果。
使用 awk
使用非常相似的逻辑:
MyVar=$(awk -v Start=1923 -v Stop=2267 'BEGIN{for (i=int(Start/100);i<=int(Stop/100);i++) MyVar=MyVar";/path/to/files" i; print substr(MyVar,2)}')
echo "$MyVar"
上述echo
语句产生:
/path/to/files19;/path/to/files20;/path/to/files21;/path/to/files22
答案2
这看起来像是大括号扩展的工作,加上一些字符串操作的评估:
MyVariable=$(eval "printf '%s' /path/to/files{${Start:0:2}..${Stop:0:2}}\;")
然后你可能想通过删除最后的分号${MyVariable%;}
在上面的示例中,我假设 your${Start}
和${Stop}
true 始终至少是 3 位数字,否则您将需要调整字符串操作。