인수로 주어진 쉘 배열을 반복합니다.

인수로 주어진 쉘 배열을 반복합니다.

서버에 있는 특정 사이트의 권한과 소유권을 변경하는 작은 도우미 스크립트를 작성하려고 합니다.

이제 하나의 사이트를 전달할 수도 있고 매개변수를 건너뛰어 모든 작업을 수행할 수도 있습니다.

서버의 여러 사이트에 적용할 수 있어야 하지만 전부는 아니어야 한다는 것을 알았기 때문에 다음을 통해 배열을 전달해 보았습니다.

SLIST=("my.site.com" "your.site.com")
./website-perms 644 755 kevin "${SLIST[@]}"

그러나 배열의 첫 번째 항목만 실행합니다.my.site.com

다양한 사이트를 통과할 수 있도록 이 문제를 어떻게 해결합니까?

완전한 코드

#!/bin/bash

# Done nightly, and copied to /usr/bin/
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi
if [ $# -eq 0 ]; then
    echo "usage: ./website-perms.sh fileperm folderperm owner (1|2) (1=kevin,2=www-data) (optional) Site Array"
    exit 1
fi

function chg_perms() {
    echo "find $1 -type f -exec chmod $2 {} \\";
    echo "find $1 -type d -exec chmod $3 {} \\";
    find $1 -type f -exec chmod $2 {} \;
    find $1 -type d -exec chmod $3 {} \;
    echo "-- chg_perms done";
}

function chg_owner() {
    echo "chown -R $2:www-data $1";
    chown -R $2:www-data $1;
    echo "-- chg_owner done";
}

SITES=$4;
if [ -z $SITES ]; then
    for dir in /var/www/httpdocs/*/
    do
        dir=${dir%*/}
        chg_perms "/var/www/httpdocs/${dir##*/}" $1 $2
        chg_owner "/var/www/httpdocs/${dir##*/}" $3
    done;
else
    for dir in "${SITES[@]}" #ONLY DOES THE FIRST ITEM
    do
        chg_perms "/var/www/httpdocs/$dir" $1 $2
        chg_owner "/var/www/httpdocs/$dir" $3
    done
fi;

답변1

좋은 스크립트입니다. 일반적으로 나머지 모든 매개변수를 사이트 목록으로 사용합니다. 다음과 같은 것입니다(아직 이 모드를 테스트하지 않았습니다).

if [ $# -lt 3 ]; then
    echo >&2 "usage: $0 fileperm folderperm owner [site ...]"
    exit 1
fi

[. . . ]

fileperm="$1"
folderperm="$2"
owner="$3"
shift 3             # shift first 3 args off of list

if [ $# -eq 0 ]; then
    for dir in /var/www/httpdocs/*/    #stackexchange syntax coloring fix*/
    do
        dir="${dir%/*}"
        chg_perms "/var/www/httpdocs/${dir##*/}" "$fileperm" "$folderperm"
        chg_owner "/var/www/httpdocs/${dir##*/}" "$owner"
    done;
else
    for dir           # step through positional args ($1,$2,...,$N)
    do
        chg_perms "/var/www/httpdocs/$dir" "$fileperm" "$folderperm"
        chg_owner "/var/www/httpdocs/$dir" "$owner"
    done
fi

답변2

나는 RobertL의 접근 방식을 선호하지만 약간 다릅니다.

sites=( "${@:4}" )
# ...
for dir in "${sites[@]}"; do ...
  • 배열을 선언하려면 괄호를 사용해야 합니다.
  • "${@:4}"$4에서 시작하여 $4에서 끝나는 위치 매개변수를 가져옵니다.
  • ALLCAPSVARNAMES를 사용하는 습관을 버리십시오. 쉘 사용으로만 제한하십시오.

관련 정보