-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 ;;
我建議從你的代碼中刪除所有'unset -f funk_passcheck'。 – Cyrus
還要注意'return'不能返回一個字符串。 – choroba
要查找語法錯誤,請粘貼您的腳本:http://www.shellcheck.net/ – Cyrus