我是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
的输出而不调用它两次我应该做什么?
任何指针也很受欢迎。
答案 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>');