为什么这个BASH阵列没有建造?

时间:2013-08-21 14:49:13

标签: bash

为什么这个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

2 个答案:

答案 0 :(得分: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,这会导致管道中的最后一个命令在当前进程中执行。

答案 1 :(得分:1)

我认为您正在尝试构建一个由$DIR中所有零长度文件和目录的名称组成的数组。如果是这样,你可以这样做:

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

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

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

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