我是一个shell脚本的初学者,并且陷入了一个非常奇怪的问题。我有一个shell脚本,名为
functions.sh它包含可以从其他shell脚本调用的几个函数。其中包含两个函数,如下所示:
function setInputTableForCurrentFlow(){
if [[ $1 == *"."* ]] && [[ $2 != "" ]];
then
if [ "$SERVER_NOT_RUNNING_VAR" != "$SERVER_NOT_RUNNING" ] && [ "$SESSION_ID" != "" ];
then
CURRENT_DB=$(echo $1 | cut -d'.' -f1);
CURRENT_TABLE=$(echo $1 | cut -d'.' -f2);
PARTITION_CONTAINS_EQUAL_SIGN=$2;
server_response=$( \
curl \
-s \
-X POST \
--cookie "JSESSIONID=$SESSION_ID" \
$base_url/api/flows/$CURRENT_DB/$CURRENT_TABLE \
);
echo "setInputTableForCurrentFlow $CURRENT_DB $CURRENT_TABLE $PARTITION_CONTAINS_EQUAL_SIGN";
echo $server_response;
else
echo $SERVER_NOT_RUNNING;
fi
fi
}
function getCurrentTable(){
echo "getCurrentTable $CURRENT_DB $CURRENT_TABLE $PARTITION_CONTAINS_EQUAL_SIGN"
if [ -z $CURRENT_DB ] && [ -z $CURRENT_TABLE ] ;
then
echo "table is not set";
else
echo $CURRENT_DB.$CURRENT_TABLE;
fi
}我有另一个名为demo.sh的shell脚本,它使用以下两个函数:
INPUT_TABLE=default.clickstream
TABLE_CONTAINS_COLUMN_HEADERS=false
. $SCRIPT_HOME/./functions.sh
setTable=`setInputTableForCurrentFlow $INPUT_TABLE $TABLE_CONTAINS_COLUMN_HEADERS`;
echo "$setTable";
echo $(getCurrentTable);所以如果我像执行demo.sh脚本一样执行sh demo.sh
output
setInputTableForCurrentFlow default clickstream false
getCurrentTable table is not set这是不应该发生的,但我发现了一件奇怪的事情。如果我像这样改变demo.sh
INPUT_TABLE=default.clickstream
TABLE_CONTAINS_COLUMN_HEADERS=false
. $SCRIPT_HOME/./functions.sh
setInputTableForCurrentFlow $INPUT_TABLE $TABLE_CONTAINS_COLUMN_HEADERS;
echo $(getCurrentTable);正确的输出是
setInputTableForCurrentFlow default clickstream false
getCurrentTable default clickstream false default.clickstream所以,伙计们,我的问题是,用两种不同的方式调用相同的名字有什么区别?如果我想存储函数setInputTableForCurrentFlow的输出而不调用它两次,我应该做什么呢?
任何指示也会受到赞赏。
发布于 2015-10-17 23:30:15
第一个示例在命令替换 (`...`或$(...))中执行函数,该函数在子壳环境中运行,不能修改父环境。这意味着在setInputTableForCurrentFlow中进行的环境修改不会持续到getCurrentTable调用。第二个示例按预期修改环境。
像CURRENT_DB这样的变量可以用来存储setInputTableForCurrentFlow的输出,也可以使用指定为参数export "$3=$server_response"的变量。在某些shell中,当read是管道的最后一个成员时,它可以设置变量,但是该行为是定义的。
setInputTableForCurrentFlow $INPUT_TABLE $TABLE_CONTAINS_COLUMN_HEADERS | read setTable
如果只需要在短时间内使用setTable,则可以使用read在子subshell中设置setTable。
setInputTableForCurrentFlow $INPUT_TABLE $TABLE_CONTAINS_COLUMN_HEADERS | (
read setTable
echo $setTable
)https://stackoverflow.com/questions/33191577
复制相似问题