我有这 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 &&
...
}