Vraag "Syntaxisfout: onverwacht einde van bestand" eenvoudig script


ik heb hulp nodig voor een heel klein script, ik begrijp niet waar de fout is. Het script :

#!/bin/bash

declare -i s
declare -i m
declare -i h

if [ "$3" < 50 ]; then s=$3+10  m=$2  h=$1
        else if ["$2" < 50 ];
                then s=$3-50  m=$2+1  h=$1
                    else s=$1-50  m=$2-50  h=$1+1 fi 
fi 

echo "$h:$m:$s"

Het script voegt 10 sc toe aan de tijd die we hebben ingevoerd.

Ik krijg de volgende foutmelding: "sub_change_dirrect: regel 14: syntaxisfout: onverwacht einde van bestand"


2
2018-06-03 12:41


oorsprong




antwoorden:


Er zijn drie voor de hand liggende fouten:

  • Op de lijn else s=$1-50 m=$2-50 h=$1+1 fi, het woord fi wordt niet behandeld als een sleutelwoord, omdat het niet het eerste woord in het commando is. Voor de shell lijkt dit op drie toewijzingen die van toepassing zijn op de opdracht fi. Als u deze regel ooit moet uitvoeren, wordt er een fout weergegeven bash: fi: command not found. Leggen fi op een eigen regel (of zet een ; voor het).
  • [ "$3" < 50 ] is hetzelfde als [ "$3" ] < 50 - het is het bevel [ … ] (die ook kan worden geschreven test) met het enige argument "$3"en met een invoeromleiding van het bestand 50. Gebruik de operator voor numerieke vergelijking -ltof gebruik een rekeninstructie (( … )). Het enkele-haakconstructie is een gewoon ingebouwd commando, dus speciale karakters zoals < behouden hun normale betekenis. Het construct voor dubbele haakjes is een speciale syntaxis en u kunt gebruiken < als een operator voor numerieke vergelijking binnen.
  • ["$2" < 50 ] mist een spatie achter de openingshaak.

Ook is de gebruikelijke conventie in shell-scripts om een ​​nieuwe regel erachter te plaatsen then en else. Verder in plaats van een else blok dat volledig uit een bestaat if verklaring, zou u moeten gebruiken elif. En alsjeblieft consistent inspringen.

#!/bin/bash
declare -i s
declare -i m
declare -i h

if (( $3 < 50 )); then
  s=$3+10  m=$2  h=$1
elif (( $2 < 50 )); then
  s=$3-50  m=$2+1  h=$1
else
  s=$1-50  m=$2-50  h=$1+1
fi 

echo "$h:$m:$s"

Postscriptum Ik heb je logica niet herzien. Je lijkt ernaar te zoeken date +%T -d 'now + 10 seconds'.


3
2018-06-03 13:33



[[ $3 < 50 ]] vergelijkt $ 3 met 50 lexicografisch, dus als $ 3 bijvoorbeeld 6 is, geeft de opdracht false als resultaat, aangezien 6 na 5. gebruik komt (( )) voor rekenkundige vergelijking. - geirha
@geirha Oh, ja, natuurlijk. Vast. Bedankt. - Gilles
Ok, heel erg bedankt, sorry voor deze domme fouten, het is een van mijn eerste scripts. Natuurlijk is het meer anders dan coderen, dacht ik. Dus fi is een commando, de spaties zijn belangrijk en [] wordt gebruikt voor char / strings. En ja het is wat ik wil dat het script doet, niet om de huidige tijd + 10sc te krijgen. Nogmaals bedankt. - Sam
Oh, ik heb net een fout opgemerkt. Ik bedoelde: elif (($ 2 <59)); dan is s = $ 3-50 m = $ 2 + 1 h = $ 1 else s = $ 3-50 m = 0 h = $ 1 + 1 fi - Sam


Je vergeet het aan een ; na de geneste fi uitspraak

#!/bin/bash

declare -i s
declare -i m
declare -i h

if [ "$3" < 50 ]; then s=$3+10  m=$2  h=$1
        else if ["$2" < 50 ];
                then s=$3-50  m=$2+1  h=$1
                    else s=$1-50  m=$2-50  h=$1+1 ;fi 
fi 

echo "$h:$m:$s"

0
2018-06-03 12:59