[20250527]bash shell编程变量作用域问题.txt
--//无聊,写一个计算24点的小程序,使用bash shell编程遇到变量作用域问题,通过一个简单例子说明问题。
$ cat e4.sh
#! /bin/bash
result='bad'
echo "$1 $2 $3 $4 * * * pq" | while read line
do
res=$(echo "$line " | dc 2>/dev/null)
if [ $res = '24' ]
then
echo "method 1 : $line ok"
result='ok'
exit 1
fi
done
if [ ${result} = 'ok' ]
then
exit 0
else
echo "$1 $2 $3 $4 bad"
fi
--//如果我带入参数为 1 2 3 4,这样结果等于24,应该输出结果后马上返回。
--//而实际的情况是。
$ . e4.sh 1 2 3 4
method 1 : 1 2 3 4 * * * pq ok
1 2 3 4 bad
--//而且成功后result已经赋值ok了。但是下面的if判断语句还是执行echo "$1 $2 $3 $4 bad"。
--//赋值在管道里面操作,估计退出失效,应该在这个之外赋值。
--//而且管道里面exit退出了,实际上程序还是继续运行下去执行后面的代码。
$ cat e4.sh
#! /bin/bash
result='bad'
echo "$1 $2 $3 $4 * * * pq" | while read line
do
res=$(echo "$line " | dc 2>/dev/null)
if [ $res = '24' ]
then
echo "method 1 : $line ok"
# result='ok'
exit 1
fi
done || result='ok'
if [ $result = 'ok' ]
then
exit 0
else
echo "$1 $2 $3 $4 bad"
fi
$ ./e4.sh 1 2 3 4
method 1 : 1 2 3 4 * * * pq ok
$ ./e4.sh 1 2 3 5
1 2 3 5 bad
--//也可以修改如下:
$ cat e4.sh
#! /bin/bash
result='bad'
#echo "$1 $2 $3 $4 * * * pq" | while read line
for line in "$(echo "$1 $2 $3 $4 * * * pq")"
do
res=$(echo "$line " | dc 2>/dev/null)
if [ $res = '24' ]
then
echo "method 1 : $line ok"
result='ok'
break
# exit 1
fi
done
if [ $result = 'ok' ]
then
exit 0
else
echo "$1 $2 $3 $4 bad"
fi
--//也可以这样修改:
$ cat e5.sh
#! /bin/bash
echo "$1 $2 $3 $4 * * * pq" | while read line
#for line in "$(echo "$1 $2 $3 $4 * * * pq")"
do
res=$(echo "$line " | dc 2>/dev/null)
if [ $res = '24' ]
then
echo "method 1 : $line ok"
exit 1
fi
done && echo "$1 $2 $3 $4 bad"
--//如果等于24,返回码1,这样后面的echo "$1 $2 $3 $4 bad"不会执行。
--//管道里面的赋值如何保存,我自己也不是很清楚,查询许多链接,好像不行。
--//比较科学的写法如下,如果信息在文件里面。
#! /bin/bash
result='bad'
while read line
do
res=$(echo "$line " | dc 2>/dev/null)
if [ $res = '24' ]
then
echo "method 1 : $line ok"
result='ok'
break
# exit 1
fi
done < input.txt
if [ $result = 'ok' ]
then
exit 0
else
echo "$1 $2 $3 $4 bad"
fi
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3086069/ ,如需转载,请注明出处,否则将追究法律责任。