简体   繁体   English

尝试在 shell 脚本中调用函数时找不到命令

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

It appears that I need some assistance with a shell script.看来我需要一些 shell 脚本方面的帮助。

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.根本问题是我似乎无法在 shell 脚本中调用已定义的函数。 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.答案原来是答案部分提到的2件事的组合,两者都尝试过,但没有一起尝试。 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.删除 unset -f AND 格式化函数以正确返回字符串,而不是错误地尝试将返回输出分配给变量。 Cyrus and Choroba, thank you much.赛勒斯和乔罗巴,非常感谢。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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