Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- #Autor: Dominik Mańkowski
- is_integer() {
- if [ "$1" -eq "$1" ] 2>/dev/null; then
- echo "YES"
- else
- echo "NO"
- fi
- }
- is_operator() {
- if [ ${#1} -ne 1 ]; then # wiecej niz 1 znak
- echo "NO"
- elif [[ $1 =~ [+-/\*] ]]; then
- echo "YES"
- else
- echo "NO"
- fi
- }
- is_left_brackt() {
- if [ ${#1} -ne 1 ]; then
- echo "NO"
- elif [[ $1 =~ [\(] ]]; then
- echo "YES"
- else
- echo "NO"
- fi
- }
- is_right_brackt() {
- if [ ${#1} -ne 1 ]; then
- echo "NO"
- elif [[ $1 =~ [\)] ]]; then
- echo "YES"
- else
- echo "NO"
- fi
- }
- #######################################
- args="$@"
- if [ "$#" -lt 3 ]; then
- echo "Not enough arguments - less than 3."
- echo "Consider using --help"
- exit 1
- fi
- if [ "$1" = "--help" ]; then
- echo "
- DESCRIPTION
- Script checks if given formula is syntactically correct, and if so, then prints the result.
- Allowed operators: + - / *
- Only one level of nested brackets is allowed.
- Only integers are allowed.
- USAGE
- script_name arg1 op arg2 op ( arg3 op arg 4 op ...) op ...
- arg1, arg2, ..., argN - integers
- op - operator (+,-,/,*)
- EXAMPLES OF USAGE
- ./1.sh 1 + 2 + 3
- ./1.sh 1 + 2 \* 3
- ./1.sh 1 + \( 2 + 3 \* 4 \) / 2
- EXIT CODE
- 0 No errors
- 1 Number is not placed after operator or left bracket
- 2 Script's first argument is not a number
- 3 No number or bracket after operator
- 4 There must be at least 4 args after left bracket
- 5 Left bracket must be placed after operator
- 6 Right bracket must be placed after number
- 7 Missing left bracket
- 8 Incorrect operator (different than allowed) or number is not an integer
- 9 There is missing at least one bracket
- "
- fi
- counter=0
- arg="start"
- left_bracket=0
- while [ "$1" ]; do
- flag=0
- status=$(is_integer "$1") # sprawdz, czy argument to liczba calkowita
- if [ "$status" = "YES" ]; then
- if [ ! "$arg" = "operator" ] && [ ! "$arg" = "left_bracket" ] && [ ! "$arg" = "start" ]; then
- echo "Incorrect usage - wrongly placed number."
- echo "Must be placed after operator or left bracket."
- echo "Consider using --help"
- echo ""
- exit 1
- fi
- flag=1
- counter=1
- arg="number"
- shift
- fi
- if [ $flag -eq 0 ]; then
- if [ $counter -eq 0 ]; then # przypadek typu ./skrypt.sh + + 3
- echo "Incorrect first argument."
- echo "Consider using --help"
- echo ""
- exit 2
- fi
- status=$(is_operator "$1") # sprawdz, czy argument to operator
- if [ "$status" = "YES" ]; then
- flag=1
- arg="operator"
- shift
- if [ "$#" -eq 0 ]; then # jesli nic nie ma po operatorze, to wyswietl blad
- echo "Not enough arguments - emptiness after operator."
- echo "Consider using --help"
- echo ""
- exit 3
- fi
- fi
- fi
- if [ $flag -eq 0 ]; then
- status=$(is_left_brackt "$1")
- if [ "$status" = "YES" ]; then
- if [ "$#" -lt 5 ]; then # ( 1 + 2 ) - musi byc przynajmniej 5 znakow
- echo "Incorrect usage - not enough arguments after left bracket."
- echo "Consider using --help"
- echo ""
- exit 4
- fi
- if [ ! "$arg" = "operator" ]; then
- echo "Incorrect usage - left bracket can not be placed after a number."
- echo "Consider using --help"
- echo ""
- exit 5
- fi
- shift
- arg="left_bracket"
- flag=1
- left_bracket=1;
- fi
- fi
- if [ $flag -eq 0 ]; then
- status=$(is_right_brackt "$1")
- if [ "$status" = "YES" ]; then
- if [ ! "$arg" = "number" ]; then
- echo "Incorrect usage - right bracket must be placed after a number."
- echo "Consider using --help"
- echo ""
- exit 6
- fi
- shift
- arg="bracket"
- flag=1
- if [ $left_bracket -ne 1 ]; then
- echo "Incorrect usage - missing left bracket."
- echo "Consider using --help"
- echo ""
- exit 7
- fi
- left_bracket=0;
- shift
- fi
- fi
- if [ $flag -eq 0 ]; then
- echo "Incorrect usage - numbers are not integers or incorrect operator."
- echo "Consider using --help"
- echo ""
- exit 8
- fi
- done
- if [ $left_bracket -eq 1 ]; then
- echo "Brackets are not closed."
- echo "Consider using --help"
- echo ""
- exit 9
- fi
- result=$(($args))
- echo "$args = $result"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement