Shell脚本嵌套循环

时间:2014-04-23 16:38:57

标签: bash shell

我想在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

2 个答案:

答案 0 :(得分:3)

会尝试展开名为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