ITPub博客

首页 > 数据库 > Oracle > [20250527]bash shell编程变量作用域问题.txt

[20250527]bash shell编程变量作用域问题.txt

原创 Oracle 作者:lfree 时间:2025-05-28 21:25:00 0 删除 编辑

[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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969894