1

为什么这个 bash 数组没有填充?我相信我过去曾这样做过。回显${#XECOMMAND[@]}显示没有数据..

DIR=$1
TEMPFILE=/tmp/dir.tmp

ls -l $DIR | tail -n +2 |  sed 's/\s\+/ /g' | cut -d" " -f5,9 > $TEMPFILE


i=0
cat $TEMPFILE | while read line ;do

    if [[ $(echo $line | cut -d" " -f1) == 0 ]]; then

        XECOMMAND[$i]="$(echo "$line" | cut -d" " -f2)"
        (( i++ ))   
    fi

done
4

2 回答 2

2

当您运行 while 循环时

somecommand | while read ...

然后while循环在子shell中执行,即与主脚本不同的进程。因此,循环中发生的所有变量赋值都不会反​​映在主进程中。解决方法是使用输入重定向和/或命令替换,以便循环在当前进程中执行。例如,如果你想从你做的文件中读取

while read ....
do
    # do stuff
done < "$filename"

或者如果你不想输出一个进程,你可以做

while read ....
do
    # do stuff
done < <(some command)

最后,在 bash 4.2 及更高版本中,您可以设置shopt -s lastpipe,这会使管道中的最后一个命令在当前进程中执行。

于 2013-08-21T15:07:46.490 回答
1

我认为您正在尝试构建一个数组,该数组由$DIR. 如果是这样,您可以这样做:

mapfile -t ZERO_LENGTH < <(find "$DIR" -maxdepth 1 -size 0)

-type f(如果您只对常规文件感兴趣,请添加到 find 命令。)

这种解决方案几乎总是比尝试解析ls输出更好。

使用进程替换 ( < <(...)) 而不是管道 ( ... |) 很重要,因为这意味着 shell 变量将设置在当前 shell 中,而不是临时子 shell 中。

于 2013-08-21T15:49:17.753 回答