Grace
Grace

Reputation: 27

Linux Shell Scripting: Script Check

I am new to Linux bash scripting and I can't seem to find what I'm doing wrong. Here's my code. Entering number 2 and 3, after the prompt that I ask the user my code stops it doesn't continue to the IF ELSE statements. Thank you to those who will help!

#!/bin/bash

while true
do
    clear
    echo "Please enter one of the following options"
    echo "1. Move empty files"
    echo "2. Check file size"
    echo "3. Which file is newer"
    echo "4. File check rwx"
    echo "5. Exit".
    echo -e "Enter Choice:"
    read answer 
    case "$answer" in
        1) ./move_empty 
        exit 55 ;;
        2) echo "Enter a filename" 
           read filename
           if [ -f $filename ];
           then ./file_size 
           fi 
               ;;
        3) echo "Enter first file:"
               read filename
           echo "Enter second file:"
           read filename2
               if [ ! -f "$filename" ];
               then
                  echo "Supplied file name" $filename "does not exist";
                  if [ $filename" -nt $filename" ]; then
                  echo $filename "is newer"
                  exit 1fi
                  fi    ;;    

        5) exit ;;
    esac
done

Upvotes: 0

Views: 102

Answers (1)

David C. Rankin
David C. Rankin

Reputation: 84521

If you have completed the check at ShellCheck.net, then you should have received:

$ shellcheck myscript
No issues detected!

If you didn't work it down to that point, you are not done. You have multiple quoting problems in your script and you compare $filename -nt $filename (which is always false). Small "attention to detail" issues that make a big difference. ShellCheck.net does a thorough job, but will not find logic issues, those are left to you. The cleanup of your quoting would look similar to:

#!/bin/bash

while true
do
    clear
    echo "Please enter one of the following options"
    echo "1. Move empty files"
    echo "2. Check file size"
    echo "3. Which file is newer"
    echo "4. File check rwx"
    echo "5. Exit".
    echo -n "Enter Choice: "
    read -r answer 
    case "$answer" in
        1)  ./move_empty 
            exit 55
            ;;
        2)  echo -n "Enter a filename: " 
            read -r filename
            if [ -f "$filename" ]
            then 
                ./file_size 
            fi 
            ;;
        3)  echo -n "Enter first file: "
            read -r filename
            echo -n "Enter second file: "
            read -r filename2
            if [ ! -f "$filename2" ]
            then
                echo "Supplied file name $filename does not exist";
                if [ "$filename" -nt "$filename2" ]; then
                    echo "$filename is newer"
                    exit 1
                fi
            fi
            ;;    
        5)  exit
            ;;
    esac
done

(note: you do not need echo -e as there are no backslash escaped characters to handle in your prompt, likely you intended -n to prevent the addition of a newline at the end of the prompt)

(also note: the use of clear, while fine for some terminals, will cause problems with others. Just be aware of the potential issue.)

If your then is on the same line with your conditional expression, e.g. if [ "$filename" -nt "$filename2" ]; then then a ';' is needed after the closing ']' to indicate a newline, otherwise, there is no need for a ';'.


Logic Problems

As discussed, the logic problems are not caught by ShellCheck and you must work though the code. It looks like you intended something like the following:

        3)  echo -n "Enter first file: "
            read -r filename
            echo -n "Enter second file: "
            read -r filename2
            if [ ! -f "$filename" ] || [ ! -f "$filename2" ]
            then
                echo "Supplied file '$filename' or '$filename2' does not exist";
                exit 1
            fi
            if [ "$filename" -nt "$filename2" ]; then
                echo "$filename is newer"
            else
                echo "$filename2 is newer"
            fi
            ;;    

You just have to take it line by line...

Look things over and let me know if you have further questions.

Upvotes: 1

Related Questions