Linux 无法从嵌套的子壳获取要传递的变量

Linux 无法从嵌套的子壳获取要传递的变量,linux,bash,shell,variables,scope,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 [

我精通使用单个子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循环的末尾正确设置它,但不能在父while循环中设置它


我知道边读边写可能会让人困惑。。但是我想我可能会让它变得比需要的更复杂…

你不能从子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选项来读取语句和IFS=,作为避免意外的一般方法
您可能希望做的是导出一个变量。通过这种方式,您可以在一个脚本中定义一个变量,然后在另一个不知道该变量的脚本中调用它。这是通过以下方式完成的:

export MYVAR
export NAME=value

从这里,您的其他shell脚本将读取变量。

如果您要投票否决我,请给我一个解释,以便我可以更好地编辑我的原始帖子……这将允许父shell向其子shell提供一个变量,但不允许子shell以父进程可见的方式分配该变量。