簡體   English   中英

嘗試在 shell 腳本中調用函數時找不到命令

[英]Command not found when trying to invoke function in shell script

看來我需要一些 shell 腳本方面的幫助。

背景:首先,我是一名網絡管理員,通常一開始就盡量遠離編碼。 不幸的是,我的手此刻是被迫的,並且已經想出了一些代碼來完成工作。

根本問題是我似乎無法在 shell 腳本中調用已定義的函數。 我嘗試了不同的解決方案,包括命令替換、列出腳本外部的函數(不是最佳解決方案),甚至更改函數內部變量中使用的引號類型,但問題仍然存在。 當腳本嘗試調用該函數時,我始終收到“找不到命令”:

./massmenu.sh: line 288: funk_passcheck: command not found

這是我的一些代碼:

#!/bin/bash

# DEFINING FUNCTIONS
#------------------------------------------------------------------------------------BEGIN PASSWORD CHECK FUNCTION:
function funk_passcheck () 
{
echo "Calling password checking module..."
unset newpasswd
prompt="Please enter the NEW password you would like to configure:  "
while IFS= read -p "$prompt" -r -s -n 1 char
do
    if [[ $char == $"\0" ]];
    then
        break
    fi

    if [[ $char == $"\177" ]];
    then
        prompt=$"\b \b"
        newpasswd="${newpasswd%?}"
    else
        prompt="*"
        newpasswd+="$char"
    fi
done

echo -ne "\n"

unset chkpasswd
prompt="Please re-enter the password:  "
while IFS= read -p "$prompt" -r -s -n 1 char
do
    if [[ $char == $"\0" ]];
    then
        break
    fi

    if [[ $char == $"\177" ]];
    then
        prompt=$"\b \b"
        chkpasswd="${chkpasswd%?}"
    else
        prompt="*"
        chkpasswd+="$char"
    fi
done

echo -ne "\n"
        if [ "$newpasswd" != "$chkpasswd" ];
            then
                        echo $"\n \n"
                        echo "Passwords for new configuration did not match!"
                        echo $"\n \n"
                        exit

        elif [ "$newpasswd" == "$chkpasswd" ];
            then
                        echo $"\n \n"
                        echo "Passwords match.  Moving on..."
    fi
return $newpasswd   
}
#------------------------------------------------------------------------------------END PASSWORD CHECK FUNCTION
#------------------------------------------------------------------------------------BEGIN PASSWORD ENTRY FUNCTION
function funk_passwd () {
echo "Calling password entry module..."
while IFS= read -p "$prompt" -r -s -n 1 char
do
    if [[ $char == $"\0" ]];     then
        break
    fi

    if [[ $char == $"\177" ]];  then
        prompt=$"\b \b"
        passwd="${passwd%?}"
    else
        prompt="*"
        passwd+="$char"
    fi
done;
return $passwd
}
#------------------------------------------------------------------------------------END PASSWORD ENTRY FUNCTION
#------------------------------------------------------------------------------------BEGIN ENABLE PASSWORD ENTRY MODULE
function funk_en_passwd () {
echo "Calling ENABLE password entry module....."
echo "Clearing function parameters....."
unset enpasswd
prompt="Please enter the ENABLE Password:  "
while IFS= read -p "$prompt" -r -s -n 1 char
do
    if [[ $char == $"\0" ]];     then
        break
    fi

    if [[ $char == $"\177" ]];  then
        prompt=$"\b \b"
        enpasswd="${enpasswd%?}"
    else
        prompt="*"
        enpasswd+="$char"
    fi
done;
return $enpasswd
}
#------------------------------------------------------------------------------------END ENABLE PASSWORD ENTRY MODULE

selection=
until [ "$selection" = "0" ]; do
        echo "******************************************************************"
        echo "*              NOC MASS CONFIGURATION UTILITY                    *"
        echo "******************************************************************"
        echo ""
        echo "******************************************************************"
        echo "* THIS SHELL SCRIPT IS DESIGNED TO PERFORM MASS CONFIGURATION    *"
        echo "* FOR ROUTED AND SWITCHED DEVICES ON THE MDU BROADBAND           *"
        echo "* NETWORK.  PLEASE MAKE SURE THAT THE SEED FILES ARE POPULATED   *"
        echo "* WITH THE IPv4 ADDRESSES OF THE HOSTS TO BE CONFIGURED PRIOR    *"
        echo "* TO LAUNCHING THIS UTILITY.                                     *"
        echo "******************************************************************"
        echo ""
        echo "MAIN PROGRAM MENU"
        echo "1 - MANAGE USER CREDENTIAL SETS" #------------------------MODULE 1
        echo "2 - MANAGE SNMP CREDENTIAL SETS" #------------------------MODULE 2
        echo "3 - MAKE MASS CONFIGURATION CHANGES:  CISCO" #------------MODULE 3
        echo "4 - MAKE MASS CONFIGURATION CHANGES:  ALCATEL" #----------MODULE 4
        echo "5 - BACKUP CONFIGURATIONS VIA FTP:  ALCATEL" #------------MODULE 5
        echo ""
        echo "0 - exit program"
        echo ""
        echo -n "Enter selection: "
        read selection
        echo ""
        case $selection in
#-----------------------------------------------------------------------MODULE 1
        1 ) echo "USER CREDENTIAL SET MANAGEMENT"
                selection=
                until [ "$selection" = "0" ]; do
                echo ""
                echo "MANAGING USER CREDENTIAL SETS"
                echo "1 - MANAGE CREDENTIALS:  CISCO"
                echo "2 - MANAGE READ/WRITE CREDENTIALS:  ALCATEL"
                echo "3 - MANAGE READ-ONLY CREDENTIALS: ALCATEL"
                echo "4 - CHANGE ADMIN ACCOUNT PASSWORD: ALCATEL"
                echo ""
                echo "0 - exit program"
                echo ""
                echo -n "Enter selection: "
                read selection
                echo ""
                        case $selection in
                        1 )     echo "USER CREDENTIALS FOR CISCO DEVICES"
                                echo "**********************************************"
                                echo "* ACCOUNT INFORMATION FOR THE TELNET SESSION *"
                                echo "**********************************************"
                                echo ""
                                echo -ne "Please enter the username for the TELNET session:  "
                                read -e loginid
                                echo -ne '\n'
                                unset passwd
                                prompt="Please enter the TELNET Password:  "
                                unset -f funk_passwd
                                passwd=$( funk_passwd )
                                echo ""
                                echo ""
                                unset -f funk_en_passwd
                                enpasswd=$( funk_en_passwd )
                                echo ""
                                echo ""
                                echo ""
                                echo "***********************************************"
                                echo "*       >>>>>>>>>>>IMPORTANT<<<<<<<<<<<<      *"
                                echo "* ACCOUNT INFORMATION FOR THE NEW OR EXISTING *"
                                echo "* USER ACCOUNT.  PASSWORDS MUST BE AT LEAST 8 *"
                                echo "* CHARACTERS IN LENGTH, AND CANNOT MATCH ANY  *"
                                echo "* OF THE PREVIOUS FOUR (4) PASSWORDS.         *"
                                echo "*                                             *"
                                echo "*       CONFIGURING READ/WRITE ACCESS         *"
                                echo "***********************************************"
                                echo ""

                                echo -ne "Please enter the username that is to be configured:  "
                                read -e newuid
                                echo -ne '\n'
                                unset -f funk_passcheck
                                newpasswd=$( funk_passcheck )
                                for device in `cat lists/cisco-list.txt`; do
                                ./expect/cisco-rw.exp $device $loginid $passwd $enpasswd $newuid $newpasswd;
                                done
                                echo ""
                                echo "**********************************"
                                echo "*  SYSTEM CONFIGURATION COMPLETE *"
                                echo "**********************************"
                                echo ""
                                exit ;;

                        2 ) echo "*******************************************"
                                echo "* ACCOUNT INFORMATION FOR THE SSH SESSION *"
                                echo "*******************************************"
                                echo ""
                                echo -ne "Please enter the username for the SSH session:  "
                                read -e loginid
                                echo -ne '\n'
                                unset passwd
                                prompt="Please enter the SSH session Password:  "
                                unset -f funk_passwd
                                passwd=$( funk_passwd )
                                echo ""
                                echo ""
                                echo ""

                                echo "***********************************************"
                                echo "*       >>>>>>>>>>>IMPORTANT<<<<<<<<<<<<      *"
                                echo "* ACCOUNT INFORMATION FOR THE NEW OR EXISTING *"
                                echo "* USER ACCOUNT.  PASSWORDS MUST BE AT LEAST 8 *"
                                echo "* CHARACTERS IN LENGTH, AND CANNOT MATCH ANY  *"
                                echo "* OF THE PREVIOUS FOUR (4) PASSWORDS.         *"
                                echo "*                                             *"
                                echo "*       CONFIGURING READ/WRITE ACCESS         *"
                                echo "***********************************************"
                                echo ""
                                echo -ne "Please enter the username that is to be configured:"
                                read -e newuid
                                echo -ne '\n'
                                unset -f funk_passcheck
                                newpasswd=$( funk_passcheck )
                                for device in `cat lists/ale-list.txt`; do
                                ./expect/ale-rw.exp $device $loginid $passwd $newpasswd $newuid;
                                done

                                echo ""
                                echo "**********************************"
                                echo "*  SYSTEM CONFIGURATION COMPLETE *"
                                echo "**********************************"
                                echo ""
                                exit ;;

                        3 ) echo "*******************************************"
                                echo "* ACCOUNT INFORMATION FOR THE SSH SESSION *"
                                echo "*******************************************"
                                echo ""
                                echo -ne "Please enter the username for the SSH session:  "
                                read -e loginid
                                echo -ne '\n'
                                unset passwd
                                prompt="Please enter the SSH session Password:  "
                                unset -f funk_passwd
                                passwd=$( funk_passwd )
                                echo -ne '\n'
                                echo ""
                                echo ""
                                echo ""
                                echo "***********************************************"
                                echo "*       >>>>>>>>>>>IMPORTANT<<<<<<<<<<<<      *"
                                echo "* ACCOUNT INFORMATION FOR THE NEW OR EXISTING *"
                                echo "* USER ACCOUNT.  PASSWORDS MUST BE AT LEAST 8 *"
                                echo "* CHARACTERS IN LENGTH, AND CANNOT MATCH ANY  *"
                                echo "* OF THE PREVIOUS FOUR (4) PASSWORDS.         *"
                                echo "*                                             *"
                                echo "*        CONFIGURING READ-ONLY ACCESS         *"
                                echo "***********************************************"
                                echo ""
                                echo -ne "Please enter the username that is to be configured:"
                                read -e newuid
                                echo -ne '\n'
                                unset -f funk_passcheck
                                newpasswd=$( funk_passcheck )
                                for device in `cat lists/ale-list.txt`; do
                                ./expect/ale-ro.exp $device $loginid $passwd $newpasswd $newuid;
                                done
                            echo ""
                            echo "**********************************"
                            echo "*  SYSTEM CONFIGURATION COMPLETE *"
                            echo "**********************************"
                            echo ""
                            exit ;;

答案原來是答案部分提到的2件事的組合,兩者都嘗試過,但沒有一起嘗試。 刪除 unset -f AND 格式化函數以正確返回字符串,而不是錯誤地嘗試將返回輸出分配給變量。 賽勒斯和喬羅巴,非常感謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM