我精通使用单个子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 reads
和sub-shells
可能会让人感到困惑。但我想我可能会让它变得比它需要的更复杂......
答案 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
变量。