我在重新分配POSTCODE_VALID变量时遇到问题。当满足if条件时,它不会被重新分配。我确保满足if条件并且应该将其设置为true。但事实并非如此。有谁知道为什么?
POSTCODE_VALID=false
find codepoint/ | while read i ;
do
if [[ $i =~ codepoint/$AREACODE ]]
then
#This is the variable that doesn't get re-assigned.
POSTCODE_VALID=true
fi
done
答案 0 :(得分:6)
管道创建子壳; POSTCODE_VALID
的赋值对于该shell是本地的,因此不会影响父级中的POSTCODE_VALID
。
更简单的解决方案是检查codepoint/$AREACODE
是否存在。
if [[ -f codepoint/$AREACODE ]]; then
POSTCODE_VALID=true
else
POSTCODE_VALID=false
fi
如果您确实需要进行更一般的匹配,请使用for循环并在匹配后立即中断:
POSTCODE_VALID=false
for f in "codepoint/$AREACODE"*; do
if [[ -f $f ]]; then
POSTCODE_VALID=true
break
fi
done
(基本上,这个循环最多只执行一次;如果没有匹配,则会按字面意思处理glob,当然,它不会是现有文件的名称。)
答案 1 :(得分:1)
问题是你的管道,它(在bash中,而不是ksh)创建一个子shell。使用管道的替代方法是使用进程替换:
POSTCODE_VALID=false
while read i
do
if [[ $i =~ codepoint/$AREACODE ]]
then
POSTCODE_VALID=true
break
fi
done < <(find codepoint/)
我添加了break
,因为一旦设置了变量,再次设置就没有意义了。
虽然我喜欢@ chepner的解决方案,以避免find
和read
。
答案 2 :(得分:0)
另一个(快速和肮脏)解决方案是使用您自己的代码,但如果找到您的isacode而不是使用变量,则使用“touch”创建临时文件 - 有点难看,但可行。这将允许测试更复杂的目录结构。
当然,您必须在开始之前删除临时文件:
rm /tmp/AreacodeFound 2> /dev/null