2014-01-15 159 views
2

我有一个关于在Bash脚本中使用变量作为命令输入的简单问题。我想编写一个脚本,它自动将目录foo的某些内容复制到通过ssh连接到另一个目录bar的嵌入式计算机。在变量中使用变量作为函数参数

换句话说,我希望把下面的命令到一个更容易维护脚本:

ssh -r /foo/{file1,file2,dir1,*.h,*.hpp,*.c,*.cpp} [email protected]:~/bar 

到目前为止,我有以下几点:

#!/bin/bash 

SOURCE='/foo'; 
FILES='{file1,file2,dir1,*.h,*.hpp,*.c,*.cpp}'; 
DESTINATION='[email protected]:~/bar'; 

set -x 
scp -r $SOURCE/$FILES $DESTINATION 
set +x 

然而,这被作为执行:

ssh -r '/foo/{file1,file2,dir1,*.h,*.hpp,*.c,*.cpp}' '[email protected]:~/bar' 

我确定我在某处使用了错误的引号或括号,但我收费我喜欢我尝试过的一切。感谢任何能够帮助新手的人。 :)

回答

2

manual会告诉你,括号扩展是任何其他扩展之前进行的...

我不认为你有任何选项,但如果你想利用在这里使用eval变量的命令:

SOURCE='/foo'; 
FILES='{file1,file2,dir1,*.h,*.hpp,*.c,*.cpp}'; 
FILELIST="$(eval echo "${SOURCE}"/"${FILES}")" 

后来说:

scp -r "$FILELIST" $DESTINATION 
+0

那么你肯定让我更接近解决方案。在你的方法中,FILELIST得到了扩展,但scp的参数仍然出现在单引号内,所以在我的情况下(其中'/ foo'是当前目录'.','DESTINATION'是引用主目录''' ,那些符号没有得到解析,我不得不修改你的解决方案来阅读'scp -r $(eval echo“$ FILELIST”)$(eval echo $ DESTINATION)''来工作,谢谢你的帮助! –

1

如果将大括号或* s放在引号内,它们将不会被shell扩展。因此,使用方法:

scp -r "$SOURCE/"{file1,file2,dir1,*.h,*.hpp,*.c,*.cpp} $DESTINATION 

如果你真的要定义文件列表调用scp前,然后用一个bash数组:

filelist=("$SOURCE/"{file1,file2,dir1,*.h,*.hpp,*.c,*.cpp}) 

scp -r "${filelist[@]}" $DESTINATION 

这里,filelist是一个数组,"${filelist[@]}"是bash的特殊咒语返回列表中的每个文件名作为scp的单独参数。

+0

我结束了使用更接近devnull的方法,但感谢您的帮助,并教我一些关于bash数组的新东西!=) –