如何在bash中填充此变量?

如何在bash中填充此变量?,bash,shell,Bash,Shell,我正在尝试从bash脚本运行类似这样的内容: HOST=foo DIR=bar ssh user@$HOST " function test { CURHOST=$HOST cd $DIR mkdir -p $CURHOST }; test" 当我使用set-x运行它时,我看到它转换为: + ssh user@foo ' function test { CURHOST=foo cd bar mkdir -p

我正在尝试从bash脚本运行类似这样的内容:

HOST=foo
DIR=bar

ssh user@$HOST "
function test
{
    CURHOST=$HOST
    cd $DIR
    mkdir -p $CURHOST
}; test"
当我使用
set-x运行它时,我看到它转换为:

+ ssh user@foo '
   function test
   {
       CURHOST=foo
       cd bar
       mkdir -p
   }; test

当然,它会抱怨
mkdir-p
没有参数。为什么会这样?如何在其中设置局部变量

为了防止替换,可以使用单引号
“…”
或反斜杠
\
;例如,此命令:

echo '$foo' \$foo "\$foo"
将打印以下内容:

$foo $foo $foo
并且不会使用变量
foo

在您的情况下,除了特别需要替换的地方外,您可能应该在任何地方使用
“…”
,而不是对整个参数使用
“…”
。因此:

HOST=foo
DIR=bar

ssh user@$HOST '
function test
{
    CURHOST='"$HOST"'
    cd $DIR
    mkdir -p $CURHOST
}; test'

只要避开美元符号:

echo "
function test
{
    CURHOST=$HOST
    cd $DIR
    mkdir -p \$CURHOST
}; test"
给你:

function test
{
    CURHOST=foo
    cd bar
    mkdir -p $CURHOST
}; test

我建议使用here文档而不是多行字符串,即
ssh user@$HOST。您也可以对函数的本地变量使用
local
。最后,即使您可以使用
function test
声明函数,但更常见的做法是使用
test()