分页: 1 / 1

shell 变量作用域的问题

发表于 : 2011-09-14 23:36
kusamba

代码: 全选

#!/bin/sh

set -xv

var="this is a test"
export var

grep "a" 01.txt | while read line
do
  aVar=`echo ${line} | awk '{print $1}'`
  if [ "${aVar}" = "b" ]
  then
  var="bbb"
  break
  fi
done

echo $var
01.txt:
a user1@password1
b user2@password2
c user3@password3

为什么var还是"this is a test"?var在循环中确认赋过值的

Re: shell 变量作用域的问题

发表于 : 2011-09-14 23:51
我就是我2
#!/bin/sh

代码: 全选

#!/usr/bin/env zsh
zsh没有问题。

或者使用下面的代码

代码: 全选

#!/bin/sh
set -xv
var="this is a test"
export var
for i in `grep "a" 01.txt`;
do  
    .....
    then
        var="bbb"
        break
    fi  
done
echo "$var"
问题应该是在read命令上。

代码: 全选

#!/bin/sh
set -xv
var="this is a test"
export var
for i in `awk '/a/ && $1=="b"{print $1}' 01.txt`;
do  
    if [ "${i}" = "b" ]
    then
        var="bbb"
        break
    fi  
done
echo "$var"

Re: shell 变量作用域的问题

发表于 : 2011-09-15 20:10
ebok
sh,bash在管道后的变量相当于局部变量,圆括号中的子shell也一样。

Re: shell 变量作用域的问题

发表于 : 2011-09-17 14:06
tusooa

代码: 全选

grep "a" 01.txt | while read line
有管道,就会起子shell了。

代码: 全选

while read line ; do something ; done <<< "$(grep a 01.txt)"
这样估计可以

Re: shell 变量作用域的问题

发表于 : 2011-09-17 17:07
fnan
#!/bin/sh

set -xv

var="this is a test"
export var

grep "a" 01.txt | (while read line
do
aVar=`echo ${line} | awk '{print $1}'`
if [ "${aVar}" = "b" ]
then
var="bbb"
break
fi
done

echo $var)
或者:
set -xv;var="this is a test";grep -q '^b .*a' 01.txt;if [ $? -eq 0 ]; then var="bbb";fi;echo $var