引数で与えられたシェル配列を繰り返します。

引数で与えられたシェル配列を繰り返します。

サーバー上の特定のサイトの権限と所有権を変更する小さなヘルパースクリプトを作成しようとしています。

1つのサイトを渡すことも、パラメータをスキップしてすべての操作を実行することもできます。

サーバー上のさまざまなサイトに適用できるはずですが、すべてではないはずだとわかったので、次のように配列を渡してみました。

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を使用する習慣を捨ててください。シェルの使用のみに制限してください。

関連情報