Linux 无法从嵌套的子壳获取要传递的变量
我精通使用单个子shell中的变量。。。但这有点难!我的目标是,设置一个众所周知的全局,我知道它们不存在,请原谅在我的while循环完成后使用本地语言。我想做的是测试db表是否已经被修改,以便将来在同一个脚本中使用——IELinux 无法从嵌套的子壳获取要传递的变量,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 [
( 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以父进程可见的方式分配该变量。