我正在尝试将环境变量传递给我的shell脚本,然后回显我传入的内容。在此示例中,$ HOME是已设置的环境变量。
./my_script.ksh $HOME
#! /usr/bin/ksh
my_var=${1}
echo "You sent: ${my_var}"
我希望我的输出为You sent: $HOME
,但它正在评估它并正在生成You Sent: /home/blah/usr
关键是我打算做一个SSH命令,我需要传递$ my_var太未评估(也就是$ HOME),因为每个服务器上的$ HOME是一个不同的值,对于我想要的SSH命令它使用来自服务器的值也是SSH的。所以希望只是传递它,所以在SSH期间它会正确评估
这是我想要发生的事情的一个例子。我们假设$ HOME已经在Server1和Server2上设置为:
Server1 $HOME: /home/blah/usr
Server2 $HOME: /home/superblah/newusr
从Server1执行my_script.ksh $HOME
该脚本与上面的相同,只有一行:
ssh my_user@Server2 "echo Server got: $my_var"
我目前的输出是什么:
You sent: /home/blah/usr
Server got: /home/blah/usr
我想要的只是生成的ssh命令:
Server got: /home/superblah/newusr
感谢。
答案 0 :(得分:0)
您可以通过用单引号
包装来阻止解析变量./my_script.ksh '$HOME'
我试过这样:
[host1]$ echo $HOME
/home/user1
[host1]$ ssh user2@host2 echo '$HOME'
/home/user2
[host1]$
答案 1 :(得分:0)
$url = '/optimize/index.php';
可用于将envsubst
或$HOME
形式的字符串替换为具有相同名称的环境变量的值。因此:
$foo
...将发出:
#!/usr/bin/env ksh
my_var=$1
my_var_subst=$(envsubst <<<"$my_var")
echo "You sent: ${my_var}"
echo "Interpreted as: ${my_var_subst}"
使用You sent: $HOME
Interpreted as: /home/superblah/newusr
调用。
请注意,在通过SSH传递值时需要小心,因为SSH使用传递的参数隐式运行./myscript '$HOME'
- 将它们与空格连接在一起并将该单个字符串作为shell命令进行评估。因此,在ssh上运行命令可能如下所示:
sh -c "$*"
...或...
ssh somehost $'./myscript \'$HOME\''
...或者,为了让它更容易,让shell为你做逃避工作:
ssh somehost "./myscript \$HOME"