展开包含两个或多个变量的复合变量

展开包含两个或多个变量的复合变量

我有这 5 个变量:

drt="/var/www/html"

drt_chown="chown -R www-data:www-data ${drt}/"
drt_chmod="chmod -R a-x,a=rX,u+w ${drt}/"
rss="systemctl restart nginx.service"
rpf="/etc/init.d/php*-fpm restart"

我尝试在 a 中组合/连接/添加最后 4 个变量复合变量命名rse,这样我就可以轻松地一次展开所有这些:

rse="${drt_chown} ; ${drt_chmod} ; ${rss} ; ${rpf}"

然后我尝试扩展rse

${rse}

遗憾的是,这种扩展rse失败了,并出现了以下错误:

chown: cannot access ';': No such file or directory
chown: cannot access 'chmod': No such file or directory
chown: cannot access 'a-x,a=rX,u+w': No such file or directory
chown: cannot access ';': No such file or directory
chown: cannot access 'systemctl': No such file or directory
chown: cannot access 'restart': No such file or directory
chown: cannot access 'nginx.service': No such file or directory
chown: cannot access ';': No such file or directory
chown: cannot access 'restart': No such file or directory

我的问题是扩展复合变量的正确且最短的方法是什么?或者至少,您认为最好的选择是什么?

方面任务对我来说非常重要。


笔记:

1. 当前问题是以下问题的后续问题这个问题,错误地问(因为我实际上想问当前的问题)。

2. Google 关键字(标签中不可用):扩展主变量/巨型变量或变量的变量。

答案1

连接变量不是问题,两个赋值都rse可以很好地连接字符串。该问题与您之前的问题相同:变量扩展后不会解释像;and &&(and&|and>等)这样的特殊运算符。"

也就是说,这里没有重定向或条件,只是字符串内的变量扩展(一种字符串连接)。其中的引号cmd也不特殊:

$ cmd1='echo "foo" > bar'
$ cmd2='echo "false"'
$ cmd="$cmd1 || $cmd2"
$ $cmd
"foo" > bar || echo "false"

您可能应该使用函数来代替,例如

drt="/var/www/html"
drt_chown() { chown -R www-data:www-data "${drt}/"; }

然后像任何命令一样运行它,只需使用drt_chown.请注意,它将应用变量的当前值drt

更好的是,让函数接受一个参数:

www_chown() { chown -R www-data:www-data "$1"; }

www_chown /var/www/html

然后,如果您愿意,您可以创建一个调用其他函数的函数。

doitall() {
    drt_chown &&
    drt_chmod &&
    ...
}

相关内容