无法通过嵌套子shell传递变量

时间:2017-05-02 23:20:53

标签: linux bash shell variables scope

我精通使用单个子shell中的变量......但这有点困难!我的目标是设置一个众所周知的全球性的" (我知道他们不存在,原谅白话)在while循环完成后使用。我正在尝试做的是测试是否已修改db表以供将来在同一脚本中使用 - IE

( while read p; do
   mysql --login-path=local -e "SELECT count(id) as row_count FROM myTable"  | ( while read row_count; do

        if [ $row_count = 0 ]
        then
           mysql --login-path=local -e"INSERT INTO someTable (this, that, other) VALUES ('$p', 'generated', 'generated');";
           echo "Inserted $p into database successfully";
           modified=1;
        fi

   done modified=$modified )

done <mytextfile 

   if [ $modified = 1 ]
      then
       # complete the stuff that needs done if the DB was modified just now
   fi
)

但我的$modified变量仍然返回空。我甚至尝试在第一次使用if语句后重置它,但没有用。我可以在MySQL while loop结束时正确设置它,但不能在父while loop

结束时设置正确

我知道do while readssub-shells可能会让人感到困惑。但我想我可能会让它变得比它需要的更复杂......

2 个答案:

答案 0 :(得分:0)

您无法从子shell中获取变量。你不能。您可以获得返回代码,但它确实是最后的手段。

实现目的的最佳方法是在同一过程中保留您关注的脚本部分。

这通常使用流程替换而不是管道,如下所示:

while IFS= read -r p
do
  while IFS= read -r row_count
  do
    if
      ((!row_count))
    then
      mysql --login-path=local -e "INSERT INTO someTable (this, that, other) VALUES ('$p', 'generated', 'generated');"
      echo "Inserted $p into database successfully"
      modified=1
     fi
  done < <(mysql --login-path=local -e "SELECT count(id) as row_count FROM myTable")
done <mytextfile 
if
  ((modified))
then
  # complete the stuff that needs done if the DB was modified just now
fi

与您的代码相比有一些变化:

  • 使用算术表达式(( ))进行测试(否则你应该双引号变量替换或使用[[ ]]进行测试
  • -r语句和read添加了IFS=选项,作为避免意外情况的一般方法

答案 1 :(得分:0)

您可能要做的是导出变量。通过这种方式,您可以在一个脚本中定义变量,并在另一个不知道变量的脚本中调用它。这可以通过以下方式完成:

export MYVAR
export NAME=value

从这里开始,你的其他shell脚本会read变量。