Function
如何從變數中刪除字元以刪除–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
但前提是它在--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 ;;