我想在4月14日至22日之间制作一份文件清单。
文件名将在名称中包含日期,例如J0018658.WANCL90A.16Apr2014.214001.STD.txt
。
我试过这个剧本。
for i in 14 15 16 17 18 19 20 21 22; do
for x in *$iApr*.txt; do
echo "$x"
done
done
我在AIX上使用它,默认shell是ksh。然而,sh和bash也可用。这适用于ksh:
for i in 14 15 16 17 18 19 20 21 22; do
for x in *${i}Apr*.txt; do
echo "$x"
done
done
这对bash来说效果更好:
#!/bin/bash
shopt -s nullglob
for i in {14..22}; do
for x in *${i}Apr*.txt; do
echo "$x"
done
done
答案 0 :(得分:3)
bash会尝试展开名为iApr
的变量,这不是您想要的。
相反,尝试使你的内部循环看起来像这样:
for x in *${i}Apr*.txt; do
此外,你的外部循环可以类似于@ anubhava的答案中的概念:
for i in {14..22}; do
所以脚本应该是这样的:
#!/bin/bash
shopt -s nullglob
for i in {14..22}; do
for x in *${i}Apr*.txt; do
echo "$x"
done
done
再次感谢@anubhava指出shopt -s nullglob
关于#!/bin/sh
与#!/bin/bash
:
如果您正在运行Linux,则/bin/sh
可能只是/bin/bash
的符号链接。从手册页:
如果使用名称sh调用bash,它会尝试尽可能接近地模仿sh的历史版本的启动行为,同时也符合POSIX标准。
答案 1 :(得分:2)
你可以这样做:
ls *{14..22}Apr*.txt
OR在BASH:
shopt -s nullglob; echo *{14..22}Apr*.txt