Tell us what’s happening:
A task isn’t passing, even though my script appears to do what it says.
It says
If you pick a service that doesn’t exist, you should be shown the same list of services again
Your code so far
My script and database can be found here: github, displayed below:
#!/bin/bash
PSQL="psql -X --username=freecodecamp --dbname=salon --tuples-only -c"
echo -e "\n~~~~~ MY SALON ~~~~~\n"
echo -e "\nWelcome to My Salon, how can I help you?"
MAIN_MENU() {
if [[ $1 ]]
then
echo -e "$1"
fi
SERVICES=$($PSQL "SELECT * FROM services ORDER BY service_id;")
echo "$SERVICES" | while read SERVICE_ID BAR SERVICE_NAME
do
if [[ $SERVICE_ID =~ ^[0-9]+$ ]]
then
echo "$SERVICE_ID) $SERVICE_NAME"
fi
done
read SERVICE_ID_SELECTED
if [[ ! $SERVICE_ID_SELECTED =~ ^[0-9]+$ ]]
then
MAIN_MENU "\nTry entering a number."
fi
SERVICE_NAME=$($PSQL "SELECT name FROM services WHERE service_id = $SERVICE_ID_SELECTED;")
if [[ -z $SERVICE_NAME ]]
then
MAIN_MENU "\nPlease choose one of the available services."
fi
echo -e "\nWhat's your phone number?"
read CUSTOMER_PHONE
CUSTOMER_NAME=$($PSQL "SELECT name FROM customers WHERE phone = '$CUSTOMER_PHONE';")
if [[ -z $CUSTOMER_NAME ]]
then
echo -e "\nI don't have a record for that phone number, what's your name?"
read CUSTOMER_NAME
INSERT=$($PSQL "INSERT INTO customers(phone, name) VALUES ('$CUSTOMER_PHONE', '$CUSTOMER_NAME');")
fi
CUSTOMER_ID=$($PSQL "SELECT customer_id FROM customers WHERE phone = '$CUSTOMER_PHONE';")
echo "What time would you like your $SERVICE_NAME, $CUSTOMER_NAME?"
read SERVICE_TIME
INSERT=$($PSQL "INSERT INTO appointments(customer_id, service_id, time) VALUES ($CUSTOMER_ID, $SERVICE_ID_SELECTED,'$SERVICE_TIME');")
echo -e "I have put you down for a $SERVICE_NAME at $SERVICE_TIME, $CUSTOMER_NAME."
}
MAIN_MENU
Still no luck, is there somewhere we can see the specific test? Otherwise is there anybody who has passed this, would you mind sharing your code?
For what it’s worth, my code is passing all other tests, but i’ve updated formatting a bit:
PSQL="psql -X --username=freecodecamp --dbname=salon --tuples-only -c"
echo -e "\n~~~~~ MY SALON ~~~~~\n"
echo -e "\nWelcome to My Salon, how can I help you?\n"
MAIN_MENU() {
if [[ $1 ]]
then
echo -e "$1"
fi
SERVICES=$($PSQL "SELECT * FROM services ORDER BY service_id;")
echo "$SERVICES" | while read SERVICE_ID BAR SERVICE_NAME
do
if [[ $SERVICE_ID =~ ^[0-9]+$ ]]
then
echo "$SERVICE_ID) $SERVICE_NAME"
fi
done
read SERVICE_ID_SELECTED
if [[ ! $SERVICE_ID_SELECTED =~ ^[0-9]+$ ]]
then
MAIN_MENU "\nTry entering a number."
fi
SERVICE_NAME=$($PSQL "SELECT name FROM services WHERE service_id = $SERVICE_ID_SELECTED;")
SERVICE_NAME=$(echo $SERVICE_NAME | sed -E 's/^ +| +$//g')
if [[ -z $SERVICE_NAME ]]
then
MAIN_MENU "\nI could not find that service. What would you like today?"
fi
echo -e "\nWhat's your phone number?"
read CUSTOMER_PHONE
CUSTOMER_NAME=$($PSQL "SELECT name FROM customers WHERE phone = '$CUSTOMER_PHONE';")
if [[ -z $CUSTOMER_NAME ]]
then
echo -e "\nI don't have a record for that phone number, what's your name?"
read CUSTOMER_NAME
if [[ $CUSTOMER_NAME ]]
then
INSERT=$($PSQL "INSERT INTO customers(phone, name) VALUES ('$CUSTOMER_PHONE', '$CUSTOMER_NAME');")
fi
fi
CUSTOMER_NAME=$(echo $CUSTOMER_NAME | sed -E 's/^ +| +$//g')
CUSTOMER_ID=$($PSQL "SELECT customer_id FROM customers WHERE phone = '$CUSTOMER_PHONE';")
echo -e "\nWhat time would you like your $SERVICE_NAME, $CUSTOMER_NAME?"
read SERVICE_TIME
if [[ $SERVICE_TIME ]]
then
INSERT=$($PSQL "INSERT INTO appointments(customer_id, service_id, time) VALUES ($CUSTOMER_ID, $SERVICE_ID_SELECTED,'$SERVICE_TIME');")
echo -e "\nI have put you down for a $SERVICE_NAME at $SERVICE_TIME, $CUSTOMER_NAME."
fi
EXIT
}
EXIT(){
echo -e "Goodbye!"
}
MAIN_MENU```
Okay, so I’m not exactly sure why, but the reason it wouldn’t pass was because of the control flow of the script. Basically, I avoided using else after calling MAIN_MENU, forgetting that the script would eventually jump back to where it had split. After adding the else keywords and embedding remaining code in the else blocks, all the tests passed.