BASH 脚本中的无限 while-loop
Infinite while-loop in BASH script
我真的很难理解为什么这个 while-loop 永远不会结束,当循环开始时,我的变量 LOC 被设置为 Testing/,这是我创建的用于测试这个程序的目录,它有以下布局:
我希望循环在所有目录都应用了 "count" 函数后结束。
以下是我尝试过的方法;
我检查了我的计数函数,它没有产生无限循环
我已经尝试 运行 手动通过算法
PARSE=1
LOC=$LOC/
count
AVAILABLEDIR=$(ls $LOC -AFl | sed "1 d" | grep "/$" | awk '{ print }')
while [ $PARSE = "1" ]
do
if [[ ${AVAILABLEDIR[@]} == '' ]]; then
PARSE=0
fi
DIRBASE=$LOC
for a in ${AVAILABLEDIR[@]}; do
LOC="${DIRBASE}${a}"
LOCLIST="$LOCLIST $LOC"
count
done
for a in ${LOCLIST[@]}; do
TMPAVAILABLEDIR=$(ls $a -AFl | sed "1 d" | grep "/$" | awk '{ print }')
PREPEND=$a
if [[ ${TMPAVAILABLEDIR[@]} == '' ]]; then
continue
fi
for a in ${TMPAVAILABLEDIR[@]}; do
TMPAVAILABLEDIR2="$TMPAVAILABLEDIR2 ${PREPEND[@]}${a}"
done
NEWAVAILABLEDIR="$NEWAVAILABLEDIR $TMPAVAILABLEDIR2"
done
AVAILABLEDIR=$NEWAVAILABLEDIR
NEWAVAILABLEDIR=''
LOC=''
done
我真的很挣扎,任何意见都将不胜感激,过去几个小时我一直在努力解决这个问题。
你应该尝试 运行 带有参数 -x 的脚本,或者将其写入第一行:
#!/bin/bash -x
然后它会告诉你它所做的一切。
在这种情况下,您可能会注意到两个错误:
您从未重置 TMPAVAILABLEDIR2
您也可以对常规文件执行 ls。
您写道要对所有目录执行 "count"。
查看find的选项:
find $LOC -type d | while read dir; do
cd $LOC
cd ${dir}
count
done
或更短(当您的函数 count 接受目录作为参数 1 时)
find $LOC -type d | xargs count
我现在看到您不想使用 find 或 ls -R(递归函数)。
然后你应该制作你自己的递归函数,有点像
function parseDir {
ls -d */ | while read dir; do
count
parseDir /$dir
done
}
如果你真的必须避免递归,试试这个,完全无递归:
#!/bin/bash
count() {
echo counting ""
}
todo=(Testing)
while test ${#todo[@]} != 0
do
doit=("${todo[@]}")
todo=()
for dir in "${doit[@]}"
do
for entry in "$dir"/* # if dir is empty, this shows an entry named "*"
do
test -e "$entry" || continue # skip the entry "*" of an empty dir
count "$entry"
test -d "$entry" || continue
todo+=("$entry")
done
done
done
但是,请告诉我 - 为什么不能使用递归?是一种过敏吗?誓言?您居住的地方是否有任何禁止递归软件的当地法律?
我不知道这是否可行,但这是一个我一直在思考的有趣问题。祝你好运
while true ; do
for word in "$(echo *)" ; do
if [[ -d "$word" ]] ; then
d[$((i++))]="$PWD"/"$word"
elif [[ -f "$word" ]] ;then
f[$((j++))]="$PWD"/"$word"
fi
done
[[ $k -gt $i ]] && cd ..
cd "$d[$((k++))]" || break
done
我真的很难理解为什么这个 while-loop 永远不会结束,当循环开始时,我的变量 LOC 被设置为 Testing/,这是我创建的用于测试这个程序的目录,它有以下布局:
我希望循环在所有目录都应用了 "count" 函数后结束。
以下是我尝试过的方法;
我检查了我的计数函数,它没有产生无限循环
我已经尝试 运行 手动通过算法
PARSE=1
LOC=$LOC/
count
AVAILABLEDIR=$(ls $LOC -AFl | sed "1 d" | grep "/$" | awk '{ print }')
while [ $PARSE = "1" ]
do
if [[ ${AVAILABLEDIR[@]} == '' ]]; then
PARSE=0
fi
DIRBASE=$LOC
for a in ${AVAILABLEDIR[@]}; do
LOC="${DIRBASE}${a}"
LOCLIST="$LOCLIST $LOC"
count
done
for a in ${LOCLIST[@]}; do
TMPAVAILABLEDIR=$(ls $a -AFl | sed "1 d" | grep "/$" | awk '{ print }')
PREPEND=$a
if [[ ${TMPAVAILABLEDIR[@]} == '' ]]; then
continue
fi
for a in ${TMPAVAILABLEDIR[@]}; do
TMPAVAILABLEDIR2="$TMPAVAILABLEDIR2 ${PREPEND[@]}${a}"
done
NEWAVAILABLEDIR="$NEWAVAILABLEDIR $TMPAVAILABLEDIR2"
done
AVAILABLEDIR=$NEWAVAILABLEDIR
NEWAVAILABLEDIR=''
LOC=''
done
我真的很挣扎,任何意见都将不胜感激,过去几个小时我一直在努力解决这个问题。
你应该尝试 运行 带有参数 -x 的脚本,或者将其写入第一行:
#!/bin/bash -x
然后它会告诉你它所做的一切。
在这种情况下,您可能会注意到两个错误:
您从未重置 TMPAVAILABLEDIR2
您也可以对常规文件执行 ls。
您写道要对所有目录执行 "count"。 查看find的选项:
find $LOC -type d | while read dir; do
cd $LOC
cd ${dir}
count
done
或更短(当您的函数 count 接受目录作为参数 1 时)
find $LOC -type d | xargs count
我现在看到您不想使用 find 或 ls -R(递归函数)。 然后你应该制作你自己的递归函数,有点像
function parseDir {
ls -d */ | while read dir; do
count
parseDir /$dir
done
}
如果你真的必须避免递归,试试这个,完全无递归:
#!/bin/bash
count() {
echo counting ""
}
todo=(Testing)
while test ${#todo[@]} != 0
do
doit=("${todo[@]}")
todo=()
for dir in "${doit[@]}"
do
for entry in "$dir"/* # if dir is empty, this shows an entry named "*"
do
test -e "$entry" || continue # skip the entry "*" of an empty dir
count "$entry"
test -d "$entry" || continue
todo+=("$entry")
done
done
done
但是,请告诉我 - 为什么不能使用递归?是一种过敏吗?誓言?您居住的地方是否有任何禁止递归软件的当地法律?
我不知道这是否可行,但这是一个我一直在思考的有趣问题。祝你好运
while true ; do
for word in "$(echo *)" ; do
if [[ -d "$word" ]] ; then
d[$((i++))]="$PWD"/"$word"
elif [[ -f "$word" ]] ;then
f[$((j++))]="$PWD"/"$word"
fi
done
[[ $k -gt $i ]] && cd ..
cd "$d[$((k++))]" || break
done