Function

如何從變數中刪除字元以刪除–function option1 option2

  • February 23, 2018

我創建了一個函式來記錄腳本的結果並向腳本添加了一個參數。您可以查看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但前提是它在--screen參數的選項中。因為append是參數的一個選項--screen,可能會也可能不會啟用。

基本上,我將這個約定用於我的參數: --argument=> 在腳本中執行一個函式 argument=> 前面所述的選項--argument

更簡單地說:

script.sh

#!/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

--我通過測試以下 3 個參數(如果它們包含在其中)找到了解決我的問題的方法。由於在這種情況下我正在尋找 IP 和遮罩,因此我為此添加了第二個測試。所以第一個if驗證以下參數不是腳本中的函式,然後第二個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
       ;;

引用自:https://unix.stackexchange.com/questions/425774