Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.13 KB | None | 0 0
  1. #!/bin/bash
  2. #Autor: Dominik Mańkowski
  3.  
  4. is_integer() {
  5.     if [ "$1" -eq "$1" ] 2>/dev/null; then
  6.         echo "YES"
  7.     else
  8.         echo "NO"
  9.     fi
  10. }
  11.  
  12. is_operator() {
  13.     if [ ${#1} -ne 1 ]; then # wiecej niz 1 znak
  14.         echo "NO"
  15.     elif [[ $1 =~ [+-/\*] ]]; then
  16.         echo "YES"
  17.     else
  18.         echo "NO"
  19.     fi
  20. }
  21.  
  22. is_left_brackt() {
  23.     if [ ${#1} -ne 1 ]; then
  24.         echo "NO"
  25.     elif [[ $1 =~ [\(] ]]; then
  26.         echo "YES"
  27.     else
  28.         echo "NO"
  29.     fi
  30. }
  31.  
  32. is_right_brackt() {
  33.     if [ ${#1} -ne 1 ]; then
  34.         echo "NO"
  35.     elif [[ $1 =~ [\)] ]]; then
  36.         echo "YES"
  37.     else
  38.         echo "NO"
  39.     fi
  40. }
  41.  
  42. #######################################
  43.  
  44. args="$@"
  45.  
  46. if [ "$#" -lt 3 ]; then
  47.     echo "Not enough arguments - less than 3."
  48.     echo "Consider using --help"
  49.     exit 1
  50. fi
  51.  
  52. if [ "$1" = "--help" ]; then
  53.     echo "
  54. DESCRIPTION
  55. Script checks if given formula is syntactically correct, and if so, then prints the result.
  56. Allowed operators: + - / *
  57. Only one level of nested brackets is allowed.
  58. Only integers are allowed.
  59.  
  60. USAGE
  61. script_name arg1 op arg2 op ( arg3 op arg 4 op ...) op ...
  62. arg1, arg2, ..., argN - integers
  63. op - operator (+,-,/,*)
  64.  
  65. EXAMPLES OF USAGE
  66. ./1.sh 1 + 2 + 3
  67. ./1.sh 1 + 2 \* 3
  68. ./1.sh 1 + \( 2 + 3 \* 4 \) / 2
  69.  
  70. EXIT CODE
  71. 0                   No errors
  72. 1                   Number is not placed after operator or left bracket
  73. 2                   Script's first argument is not a number
  74. 3                   No number or bracket after operator
  75. 4                   There must be at least 4 args after left bracket
  76. 5                   Left bracket must be placed after operator
  77. 6                   Right bracket must be placed after number
  78. 7                   Missing left bracket
  79. 8                   Incorrect operator (different than allowed) or number is not an integer
  80. 9                   There is missing at least one bracket
  81.  
  82.     "
  83. fi
  84.  
  85. counter=0
  86. arg="start"
  87. left_bracket=0
  88.  
  89. while [ "$1" ]; do
  90.     flag=0
  91.  
  92.     status=$(is_integer "$1")                           # sprawdz, czy argument to liczba calkowita
  93.     if [ "$status" = "YES" ]; then
  94.         if [ ! "$arg" = "operator" ] && [ ! "$arg" = "left_bracket" ] && [ ! "$arg" = "start" ]; then
  95.             echo "Incorrect usage - wrongly placed number."
  96.             echo "Must be placed after operator or left bracket."
  97.             echo "Consider using --help"
  98.             echo ""
  99.             exit 1
  100.         fi
  101.         flag=1
  102.         counter=1
  103.         arg="number"
  104.         shift
  105.     fi
  106.  
  107.     if [ $flag -eq 0 ]; then   
  108.         if [ $counter -eq 0 ]; then                     # przypadek typu ./skrypt.sh + + 3
  109.             echo "Incorrect first argument."
  110.             echo "Consider using --help"
  111.             echo ""
  112.             exit 2
  113.         fi
  114.         status=$(is_operator "$1")                      # sprawdz, czy argument to operator
  115.  
  116.         if [ "$status" = "YES" ]; then
  117.             flag=1
  118.             arg="operator"
  119.             shift
  120.             if [ "$#" -eq 0 ]; then                     # jesli nic nie ma po operatorze, to wyswietl blad
  121.                 echo "Not enough arguments - emptiness after operator."
  122.                 echo "Consider using --help"
  123.                 echo ""
  124.                 exit 3
  125.             fi
  126.         fi
  127.     fi
  128.  
  129.     if [ $flag -eq 0 ]; then
  130.         status=$(is_left_brackt "$1")
  131.         if [ "$status" = "YES" ]; then
  132.             if [ "$#" -lt 5 ]; then                     # ( 1 + 2 ) - musi byc przynajmniej 5 znakow
  133.                 echo "Incorrect usage - not enough arguments after left bracket."
  134.                 echo "Consider using --help"
  135.                 echo ""
  136.                 exit 4
  137.             fi
  138.             if [ ! "$arg" = "operator" ]; then
  139.                 echo "Incorrect usage - left bracket can not be placed after a number."
  140.                 echo "Consider using --help"
  141.                 echo ""
  142.                 exit 5
  143.             fi
  144.             shift          
  145.             arg="left_bracket"
  146.             flag=1
  147.             left_bracket=1;
  148.         fi
  149.     fi
  150.  
  151.     if [ $flag -eq 0 ]; then
  152.         status=$(is_right_brackt "$1")
  153.         if [ "$status" = "YES" ]; then
  154.             if [ ! "$arg" = "number" ]; then
  155.                 echo "Incorrect usage - right bracket must be placed after a number."
  156.                 echo "Consider using --help"
  157.                 echo ""
  158.                 exit 6
  159.             fi
  160.             shift          
  161.             arg="bracket"
  162.             flag=1
  163.             if [ $left_bracket -ne 1 ]; then
  164.                 echo "Incorrect usage - missing left bracket."
  165.                 echo "Consider using --help"
  166.                 echo ""
  167.                 exit 7
  168.             fi
  169.             left_bracket=0;
  170.             shift
  171.         fi
  172.     fi
  173.  
  174.     if [ $flag -eq 0 ]; then
  175.         echo "Incorrect usage - numbers are not integers or incorrect operator."
  176.         echo "Consider using --help"
  177.         echo ""
  178.         exit 8
  179.     fi
  180. done
  181.  
  182. if [ $left_bracket -eq 1 ]; then
  183.     echo "Brackets are not closed."
  184.     echo "Consider using --help"
  185.     echo ""
  186.     exit 9
  187. fi
  188.  
  189. result=$(($args))
  190. echo "$args = $result"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement