![](/img/trans.png)
[英]'+=: Command not found' when trying to add a value to an array - Shell Script
[英]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.