2017-01-10 23 views
-1

看起來我需要一些shell腳本的幫助。嘗試調用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 ;; 
+5

我建議從你的代碼中刪除所有'unset -f funk_passcheck'。 – Cyrus

+2

還要注意'return'不能返回一個字符串。 – choroba

+1

要查找語法錯誤,請粘貼您的腳本:http://www.shellcheck.net/ – Cyrus

回答

0

的答案竟然是中提到的兩件事情結合答案部分,這兩個都是嘗試過,但不是在一起。刪除unset -f並格式化該函數以正確地返回一個字符串,而不是錯誤地將返回輸出分配給一個變量。賽勒斯和喬羅巴,非常感謝你。