首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在调用函数时使用$或‘(倾斜)与通常使用名称调用函数有什么区别?

在调用函数时使用$或‘(倾斜)与通常使用名称调用函数有什么区别?
EN

Stack Overflow用户
提问于 2015-10-17 21:05:52
回答 1查看 656关注 0票数 0

我是一个shell脚本的初学者,并且陷入了一个非常奇怪的问题。我有一个shell脚本,名为

代码语言:javascript
复制
functions.sh

它包含可以从其他shell脚本调用的几个函数。其中包含两个函数,如下所示:

代码语言:javascript
复制
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脚本,它使用以下两个函数:

代码语言:javascript
复制
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

代码语言:javascript
复制
output
setInputTableForCurrentFlow default clickstream false
getCurrentTable table is not set

这是不应该发生的,但我发现了一件奇怪的事情。如果我像这样改变demo.sh

代码语言:javascript
复制
INPUT_TABLE=default.clickstream
TABLE_CONTAINS_COLUMN_HEADERS=false
. $SCRIPT_HOME/./functions.sh

setInputTableForCurrentFlow $INPUT_TABLE $TABLE_CONTAINS_COLUMN_HEADERS;
echo $(getCurrentTable);

正确的输出是

代码语言:javascript
复制
setInputTableForCurrentFlow default clickstream false
getCurrentTable default clickstream false default.clickstream

所以,伙计们,我的问题是,用两种不同的方式调用相同的名字有什么区别?如果我想存储函数setInputTableForCurrentFlow的输出而不调用它两次,我应该做什么呢?

任何指示也会受到赞赏。

EN

回答 1

Stack Overflow用户

发布于 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

代码语言:javascript
复制
setInputTableForCurrentFlow $INPUT_TABLE $TABLE_CONTAINS_COLUMN_HEADERS | (
        read setTable
        echo $setTable
    )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33191577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档