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