変数の削除 --function option1 option2 から文字を削除する方法

変数の削除 --function option1 option2 から文字を削除する方法

スクリプトの結果を記録する関数を作成し、スクリプトにパラメータを追加しました。あなたは見ることができますhttps://docs.laswitchtech.com/doku.php?id=documentations:linux:pxelinux

--screenこのスクリプトでは、スイッチを使用してすべてのパラメータを含む同じスクリプトを画面に実行するためのパラメータを追加しました-L

Enable_Screen(){
    Check_Package screen
    ScreenCMD="./pxelinux.sh"
    CMDOptions="$@"
    CMDOptions=${CMDOptions// --screen/}
    CMD="$ScreenCMD $CMDOptions"
    if [ $debug = "true" ]; then
        echo -e "${ORANGE}[DEBUG][EXECUTE] screen -S PXE_Linux -L $CMD ${NORM}"
    fi
    screen -S PXE_Linux -L $CMD
    mv screenlog.0 pxelinux.screen.log
    exit 0
}

これで、ログを追加するオプションをパラメータに追加したいと思います。

スクリプトの実行方法の例:

./pxelinux.sh --debug --screen --install-pxelinux

今これが私が使用したい例です

./pxelinux.sh --debug --screen append --install-pxelinux

これは画面機能のオプションなので、私が作成している画面に渡したくありません。画面機能では、--screenパラメータリストからそれらを削除したことがわかり、パラメータに表示さappendれたら削除する必要があります。ただし、それが引数のオプションの1つである場合にのみ適用されます--screenappendパラメータのオプションなので、有効または--screen無効にすることができます。

デフォルトでは、私はパラメータに次の規則を使用しています。 --argument=>スクリプトで関数を実行する= argument>前述のオプション--argument

より簡単に:

スクリプトファイル

#!/bin/bash

Config_Network(){
    echo -e "
source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
auto eth0
iface eth0 inet static
    address $1
    netmask $2
    gateway $3
" | tee -a /etc/network/interfaces
}

Update_System(){
    Command="apt-get update"; Executing "$Command"
    Command="apt-get upgrade -y"; Executing "$Command"
}

Restart_System(){
    shutdown -r now
}

Check_Package(){
    if [ $(dpkg-query -W -f='${Status}' $1 2>/dev/null | grep -c "ok installed") -eq 0 ];
    then
        Command="apt-get install $1 -y"; Executing "$Command"
    fi
}
Executing(){
    if [ $debug = "true" ]; then
        if eval $1;then
            echo -e "${GREEN}[DEBUG  ][$(date)][SUCCESS][EXECUTING] $1 ${NORM}" | tee -a $logfile
        else
            echo -e "${RED}[DEBUG  ][$(date)][ERROR  ][EXECUTING] $1 ${NORM}" | tee -a $logfile
        fi
    else
        if eval $1;then
            echo -e "${GREEN}[DEBUG  ][$(date)][SUCCESS][EXECUTING] $1 ${NORM}"
        else
            echo -e "${RED}[DEBUG  ][$(date)][ERROR  ][EXECUTING] $1 ${NORM}"
        fi

    fi
}
while test $# -gt 0
do
    case "$1" in
        --config-network)
            netconf
            ;;
        --update)
            Update_System
            ;;
        --restart)
            Restart_System
            ;;
        --*) 
            exit
            ;;
    esac
    shift
done

exit 0

これで、script.shを実行すると、$ 1 $ 2 $ 3ステートメントのどこにいても、netconf関数に渡すことができるようになります。

./script.sh --config-network 10.10.10.10 255.255.255.0 10.10.10.1 --update --restart
./script.sh --restart --config-network 10.10.10.10 255.255.255.0 10.10.10.1 --update
./script.sh --update --restart --config-network 10.10.10.10 255.255.255.0 10.10.10.1 --update

答え1

次の3つのパラメータが含まれているかどうかをテストして、--問題の解決策を見つけました。この場合、私はIPとマスクを探しているので、それについての2番目のテストを追加しました。したがって、1つ目は次のifパラメータがスクリプトの関数ではないことを確認し、2つ目は関数に渡すパラメータを確認しifます。

    --config-network)
        if [[ $2 != *--* && $3 != *--* && $4 != *--* ]]; then
            if [[ $2 =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ && $3 =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ && $4 =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
                Config_Network $2 $3 $4
            else
                Config_Network
            fi
        else
            echo "Bad [argument] $1 $2 $3 $4"
            Display_Help
            exit
        fi
        ;;

関連情報