我的bash脚本出了什么问题?

时间:2012-12-05 06:55:24

标签: linux bash shell

ssh -f $user@$machine_name "cd $path; shard_path=`find . -name \"shard0\"`; cd $shard_path; mkdir temp"

目录结构是$ path / node0 / shard0

在这个脚本中,var shard_path为空,为什么?目录temp~/中构建,但不在shard0中构建。

3 个答案:

答案 0 :(得分:2)

因为您在命令周围使用双引号发送到服务器,所以在本地扩展。它试图根据本地值替换$path$shard_path,并且由于$shard_path未在本地定义,因此它会扩展为空。

通过在服务器上执行命令使用单引号,可以避免很多这些引用问题。您需要的确切引用取决于这些变量的确切位置。但是根据你的评论,听起来这就是你需要的命令:

ssh -f $user@$machine_name "cd $path;"'shard_path=$(find . -name "shard0"); cd $shard_path; mkdir temp'

答案 1 :(得分:1)

根据您与Brian Campbell的讨论,我假设$path变量位于本地客户端,$shard_path位于远程位置。

然后尝试以下方法:

ssh -f xce@ns20.xce.n.xiaonei.com "echo $path; cd $path; shard_path=\$(find . -name \"shard0\"); echo \$shard_path;"

注意:如果有可能存在多个名为'shard0'的文件,find将输出多个路径,因此您可能希望使用
shard_path_array=( \$(find . -name \"shard0\") );
这会将find的输出放入一个数组中,然后您可以使用例如
切换到一个路径 cd \${shard_path_array[0]}(在远程计算机上)

答案 2 :(得分:0)

在通过ssh将命令发送到目标计算机之前,

$ path正在本地扩展。同上$ shard_path。如果您希望远程解释/扩展这些值,您需要转义$,例如\ $路径。

Here's a very thorough treatment on this subject