Script acha que a entrada é um comando?

0

Estou apenas começando um script que faz comandos básicos do shell, mas a segunda função, que deve ter um ano e um mês válidos e conectá-los ao cal, está retornando com este erro:

Enter the year:
2014
/home/duncan/menuscript.sh: line 34: [2014: command not found
/home/duncan/menuscript.sh: line 34: [2014: command not found
This is an invalid year

Este é o código em que estou trabalhando, já procurei a resposta e não consigo descobrir por que ela não compilará .. Eu não estou tentando inserir a data como um comando!

#!/bin/bash
echo "Welcome to Duncan's main menu"
function press_enter
{
    echo ""
    echo -n "Press Enter to continue"
    read
    clear
}
year=
month=
selection=
until [ "$selection" = "9" ] 
do
  clear
  echo ""
  echo "    1 -- Display users currently logged in"
  echo "    2 -- Display a calendar for a specific month and year"
  echo "    3 -- Display the current directory path"
  echo "    4 -- Change directory"
  echo "    5 -- Long listing of visible files in the current directory"
  echo "    6 -- Display current time and date and calendar"
  echo "    7 -- Start the vi editor"
  echo "    8 -- Email a file to a user"
  echo "    9 -- Quit"
  echo ""
  echo "Make your selection:"
  read selection
  echo ""
  case $selection in
    1) who ; press_enter ;;
    2) echo "Enter the year:" ;
       read year ;
       if [$year>1] || [$year<9999]; then
         echo "Enter the month:" 
         read month
         if [0<$month<12]; then
           cal -d $year-$month 
           press_enter
         else
           echo "This is an invalid month"
           press_enter
         fi
       else
          echo "This is an invalid year"
          press_enter 
       fi ;;

    9) exit ;;
    *) echo "Please enter a valid option" ; press_enter ;;
   esac
done
    
por Duncan 09.12.2014 / 20:22

1 resposta

1

Existe um erro de sintaxe (comum) nesta linha (OK, não apenas um ...):

[$year>1]
  1. [ não é um caractere especial, mas um comando comum. Assim, o resto da linha é parâmetros e estes devem ser separados por espaço em branco: [ "$year" > 1 ]

  2. O próximo problema é que > não é um parâmetro comum, mas o caractere de redirecionamento (um metacaractere). Assim, o shell vê (por exemplo) [2014 e procura um comando com esse nome. Se houvesse um, o shell gravaria sua saída no arquivo 1] ...

Se você usar [ ... ] , precisará do operador -gt (maior que):

[ "$year" -gt 1 ]

Uma alternativa é usar a bash reservada word [[ em vez de [ . Você ainda tem que usar o espaço em branco como separador, mas pode omitir as aspas:

[[ $year -gt 1 ]]

ou você pode usar expressões aritméticas para comparar inteiros:

((year > 1))
    
por 09.12.2014 / 20:32