2016-11-05 158 views
0

在我的bash脚本,在好几个地方,我需要运行命令Bash如何包含带引号作为变量的命令?

rsync [stuff] --exclude={"/mnt/*","/proc/*"} [source] [destination]

为了避免打字了整个名单,我要打包选项--exclude={"/mnt/*","/proc/*"}到一个名为EXCLUDES这样我可以输入变量在我的脚本:

rsync [stuff] "$EXCLUDES" [source] [destination]

什么是实现这一目标的正确方法?

+0

[Bash pass变量作为带引号的参数可能重复](http://stackoverflow.com/questions/39583838/bash-pass-variable-as-argument-with-quotes) –

+0

'EXCLUDES =' - exclude = {“/ mnt/*”,“/ proc/*”}'' –

+0

没有问题:'$ EXCLUDES'可以扩展为包含引号的内容;这些不会与'“$ EXCLUDES”'周围的引号有关。 '$ VAR'语法不能对周围的语法进行“近似引用注入攻击”。 – Kaz

回答

2

使用数组:

EXCLUDES=(
    --exclude="/mnt/*" 
    --exclude="/proc/*" 
) 
rsync [stuff] "${EXCLUDES[@]}" [source] [destination] 

或这里-DOC与--exclude-from选项:

rsync [stuff] --exclude-from - [source] [destination] <<EOF 
/mnt/proc/* 
/proc/* 
EOF 

我会建议不要在脚本中使用括号扩展。你的文本编辑器应该很容易快速复制重复的字符串,并且生成的脚本将更具可读性。 Brace扩展旨在用于交互式使用。

相关问题