2012-11-26 46 views
0

我不明白爲什麼userType沒有改變。這個Bash腳本爲什麼不改變字符串的值?

我確切地知道它的成功達到determineType,但不改變價值「BBB」,當我嘗試後打印出USERTYPE。

userType="aaa" 

function determineType { 
    userType="bbb" 
} 

function checkUser { 
    cat users.csv | \ 
    while read userLine; do 
     if [[ $userLine =~ .*$user.* ]] 
      then 
      determineType 
      echo "1" 
     fi 
    done 
    echo "0" 
} 
+0

如果您可以以某種方式改變問題,使其不那麼本地化並且對其他人更有用,那將會很好。 –

+2

你的'while'循環是一個全新的subshel​​l http://stackoverflow.com/questions/124167/bash-variable-scope – soulseekah

+0

看看「全局與本地」bash變量。 http://www.thegeekstuff.com/2010/05/bash-variables/ – cb0

回答

2

正如soulseekah在評論中所說,你的while循環是在一個子shell中執行的。相反,這樣做(和,作爲一個好處,你擺脫了無用的使用貓的):

userType="aaa" 

determineType() { 
    userType="bbb" 
} 

checkUser() { 
    while read userLine; do 
     if [[ $userLine = *$user* ]]; then 
      determineType 
      return 1 
     fi 
    done < users.csv 
    return 0 
} 

注意。我也改變了一些東西:因爲同樣可以用通配符來實現

  • 擺脫了無用的正則表達式的,
  • 使用bash中定義功能的更常見的方式,
  • 使用return代替echo對於返回值:您將再次遇到同樣的問題,使用echo:您可能會在另一個子shell中使用函數checkUser來獲取echo返回的值。
2

您正在使用管道,該管道在子外殼中啓動while .. do。 在子shell更改變量的值不會影響原變量

此時應更換:

function checkUser { 
    cat users.csv | \ 
    while read userLine; do 
     if [[ $userLine =~ .*$user.* ]] 
      then 
      determineType 
      echo "1" 
     fi 
    done 
    echo "0" 
} 

function checkUser { 
    while read userLine; do 
     if [[ $userLine =~ .*$user.* ]] 
      then 
      determineType 
      echo "1" 
     fi 
    done < users.csv 
    echo "0" 
} 

(這也擺脫沒用使用的貓)

相關問題