在调用函数时使用$或`(倾斜)和通常使用其名称调用函数之间有什么区别

时间:2015-10-17 21:05:53

标签: linux shell unix sh

我是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的输出而不调用它两次我应该做什么?

  

任何指针也很受欢迎。

1 个答案:

答案 0 :(得分:1)

第一个示例在command substitution`...`$(...))中执行该函数,该函数在subshell environment中运行,无法修改父级环境。这意味着在setInputTableForCurrentFlow中进行的环境修改不会持久地调用getCurrentTable。第二个示例按预期修改了环境。

CURRENT_DB之类的变量可用于存储setInputTableForCurrentFlow的输出,或指定为参数export "$3=$server_response"的变量。在某些shell read中,当变量是管道的最后一个成员时,它可以设置变量,但该行为是实现定义的 setInputTableForCurrentFlow $INPUT_TABLE $TABLE_CONTAINS_COLUMN_HEADERS | read setTable

如果短期内只需要setTable read,则可以使用setTable在子shell中设置setInputTableForCurrentFlow $INPUT_TABLE $TABLE_CONTAINS_COLUMN_HEADERS | ( read setTable echo $setTable )

$('.task-container').append('<ul><li class="task-list"><img class="checkmark" src="img/checkmark.jpeg" alt="Checkmark-Button"><input class="task-name" value="'+newTask+'"><input class="task-time" value="1:00"><img class="X" src="img/X.png" alt="X-Button"></li></ul>');