我有这个shell脚本,我希望将CLI输入输入到SSH命令中。第一个SSH命令按预期运行,而第二个命令将runTests.sh
的$1和$2设置为''
。似乎没有把它们代入。为什么会这样呢?
$1=7107
$2=development
ssh redacted@redacted -t 'zsh -l -c "source ~/.zshrc && ./runTests.sh 7107 development"'
ssh redacted@redacted -t 'zsh -l -c "source ~/.zshrc && ./runTests.sh $1 $2"'
您正在调用三个不同的shell:本地shell、远程登录shell和远程zsh shell。您需要仔细指定哪一个应该负责哪一个参数替换。
您的变量位于本地shell中,但是您要求远程登录shell扩展它们。这就是它失败的原因。
下面是如何让本地shell替换它们的方法:
set -- 7107 development # Assign $1 and $2
ssh redacted@redacted -t "zsh -l -c 'source ~/.zshrc && ./runTests.sh $1 $2'"
由于$1
和$2
现在在本地shell中处于双引号中,它们展开,导致zsh -l -c 'source ~/.zshrc && ./runTests.sh 7107 development'
在远程端。
这将导致在嵌套的zsh shell中出现source ~/.zshrc && ./runTests.sh 7107 development
。
理想情况下,您还希望转义数据中的特殊字符,以便带引号或空格的值正确工作:
ssh redacted@redacted -t "zsh -l -c 'source ~/.zshrc && ./runTests.sh $1 $2' _ $(printf %q "$1") $(printf %q "$2")"
$1, $2, $3, ...
保留作为命令参数,例如,如果您的脚本名称是script.sh
,当您运行:
./script.sh foo bar baz
$1
为foo
,$2
为bar
,$3
为baz
。
也不应该在赋值时使用空格。试一试:
foo=7107
bar=development
ssh redacted@redacted -t 'zsh -l -c "source ~/.zshrc && ./runTests.sh 7107 development"'
ssh redacted@redacted -t 'zsh -l -c "source ~/.zshrc && ./runTests.sh $foo $bar"'
请注意评论中指出的安全问题。