简体   繁体   中英

Command not found when trying to invoke function in shell script

It appears that I need some assistance with a shell script.

Background: First, I'm a network admin, and usually try to stay away from coding in the first place. Unfortunately my hand is forced at the moment, and have come up with some code to get a job done.

The root problem is that I can't seem to invoke a defined function in a shell script. I've tried different solutions, to include command substitution, listing the functions outside of the script (not an optimal solution), and even changing the type of quotes used in the variables inside the functions, but the problem remains. Consistently I get "command not found" when the script tries to invoke the function:

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

Here's some of my code:

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

The answer turned out to be a combination of 2 things mentioned in the answer section, both of which were tried, but not together. Removing the unset -f AND formatting the function to properly return a string, as opposed to erroneously trying to assign the return output to a variable. Cyrus and Choroba, thank you much.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM