【问题标题】:FOR loop nested in WHILE in bash/shellFOR 循环嵌套在 bash/shell 中的 WHILE
【发布时间】:2013-12-05 07:49:07
【问题描述】:

我想从 WHILE 内的 FOR 循环中获得正确的输出。 当我使用这样的命令时一切正常:

for i in `find ./ -name "*.processed" -mtime +0`; do echo "$i is COOL"; done; 

Output:
1.processed is COOL
2.processed is COOL ...

但是,当我在 bash/shell 脚本中使用它时,找到将具有适当掩码的所有文件的列表放入变量中(不是一个一个)。注意,将“echo $i is COOL”重定向到“wc -l”会返回所有文件的数量,该死。请参阅以下内容: confif 文件的条目如:

/export/home/.../ProcessedDumps;*.processed

所有路径都是完整路径。

#!/bin/bash

CONF_FILE=$1
DAYS_OLD=0
counter=0
IFS=";"

if [ "$1" = "-h" -o "$1" = "-help" -o "$#" -ne "1" ]; then
    echo "Just archive your files easy!"
    echo "Usage: `basename $0` /path_to_conf/config.cfg" && echo "Exit!"
    exit 1
fi

echo "#########################"
date '+Date: %Y.%m.%d %T'
echo

while read LOG_DIR MASK
do
    cd $LOG_DIR
    echo "Dir changed to `pwd`"
    echo "Searching with mask \"$MASK\""
    for i in `find . -name "$MASK"`
    do
    echo "$i is COOL"
    echo "test"
    done
done < $CONF_FILE

echo
echo "Total archived files: $counter"

echo
date '+Date: %Y.%m.%d %T'

Output:
1.processed
2.processed
...
n.processed is COOL
test

是 bash 提供了不同种类的嵌套循环(内部 FOR,外部 WHILE)。有什么想法吗?

【问题讨论】:

  • 我认为嵌套循环没有任何问题。看起来find 的输出没有被拆分,所以你只是foring 在一件事上。 IFS 设置了吗?
  • 你试过find . -name $MASK吗?
  • 当您执行cd 时,您给出的是绝对路径还是相对路径?
  • 请粘贴CONF_FILE的内容
  • 我很困惑... find ./ -name "*.processed -mtime +0" 不应该是 find ./ -name "*.processed" -mtime +0 吗? (仅在文件名周围引用...)

标签: bash shell unix loops


【解决方案1】:

不要全局设置IFS,这会干扰你的for循环,而是在while循环中为read在本地设置它:

while IFS=';' read LOG_DIR MASK; do
    cd $LOG_DIR
    echo "Dir changed to `pwd`"
    echo "Searching with mask \"$MASK\""
    for i in `find . -name "$MASK"`
    do
        echo "$i is COOL"
        echo "test"
    done
done < $CONF_FILE

【讨论】:

    【解决方案2】:

    问题似乎与 shell 扩展有关,以下摘录在我的测试中按预期工作

    echo logdir '"*.c"' | while read LOG_DIR MASK
    do
      MASK=${MASK#'"'};
      MASK=${MASK%'"'};
      find -name "$MASK";
      for i in `find -name "$MASK"`; do
        echo "[$i]";
      done
    done
    

    编辑:如果文件名有空格,IFS 也有重要作用,正如 hobbs 所说,在这种情况下,可以使用

    echo logdir '"*.png"' | while read LOG_DIR MASK
    do
      MASK=${MASK#'"'};
      MASK=${MASK%'"'};
      SAVEIFS=$IFS
      IFS='!'
      for i in `find -printf '%h/%f!' -name "$MASK"`; do
        ls -l "$i"
      done
      IFS=$SAVEIFS
    done
    

    【讨论】:

      猜你喜欢
      • 2013-10-26
      • 2023-03-02
      • 2020-10-09
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      相关资源
      最近更新 更多