다음과 같은 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"
나는 마지막 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. 구글 키워드(태그에서는 불가능): 호스트 변수/메가변수 또는 변수를 확장하는 변수입니다.
답변1
변수를 연결하는 것은 문제가 되지 않습니다. 두 할당 모두 rse
문자열을 연결하는 데 문제가 없습니다. 문제는 이전 문제와 동일합니다. ;
and &&
(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 &&
...
}