Bash Shell script Erreurs: ./myDemo: 56: Erreur de syntaxe: chaîne non terminée cité

StackOverflow https://stackoverflow.com/questions/1861285

  •  13-09-2019
  •  | 
  •  

Question

Quelqu'un pourrait-il jeter un oeil à ce code et trouver ce qui ne va pas avec elle?

#!/bin/sh
while :
do
    echo " Select one of the following options:"
    echo " d or D) Display today's date and time"
    echo " l or L) List the contents of the present working directory"
    echo " w or W) See who is logged in"
    echo " p or P) Print the present working directory"
    echo " a or A) List the contents of a specified directory"
    echo " b or B) Create a backup copy of an ordinary file"
    echo " q or Q) Quit this program"
    echo " Enter your option and hit <Enter>: \c"
    read option 
    case "$option" in
        d|D) date
             ;;
        l|L) ls $PWD
             ;;
        w|w) who
                 ;;
        p|P) pwd
             ;;
        a|A) echo "Please specify the directory and hit <Enter>: \c"
             read directory
                    if [ "$directory = "q" -o "Q" ]
                then
                    exit 0
                fi

                while [ ! -d "$directory" ]
                do
                        echo "Usage: "$directory" must be a directory."
                    echo "Re-enter the directory and hit <Enter>: \c"
                    read directory

                        if [ "$directory" = "q" -o "Q" ]
                        then    
                            exit 0

                        fi

                done
                    printf ls "$directory"

            ;;  
            b|B) echo "Please specify the ordinary file for backup and hit <Enter>: \c"
             read file
                if [ "$file" = "q" -o "Q" ]
                then
                    exit 0
                fi     

                while [ ! -f "$file" ]
                do
                    echo "Usage: \"$file\" must be an ordinary file."
                    echo "Re-enter the ordinary file for backup and hit <Enter>: \c"
                    read file
                        if [ "$file" = "q" -o "Q" ]
                        then
                            exit 0
                        fi              
                done
                    cp "$file" "$file.bkup"
                 ;;

        q|Q) exit 0
             ;;

    esac
    echo
done
exit 0

Il y a quelques erreurs de syntaxe que je ne peux pas comprendre. Cependant, je dois souligner que ce système unix echo -e ne fonctionne pas (ne me demandez pas pourquoi je ne sais pas et je n'ai aucune sorte de permissions de le changer et même si je ne serais pas autorisé à)

Bash Scripting Shell Erreur: "./myDemo ./myDemo: ligne 62: erreur de syntaxe près done' ./myDemo: line 62: jeton inattendu" [édité]

  

EDIT: Je fixe l'instruction tandis que l'erreur, mais maintenant, quand je lance le   scénario certaines choses ne sont pas encore   fonctionne correctement.

     
      
  1. Il semble que dans le b | B) instruction switch

         

    cp fichier $ file.bkup de $ ne   en fait une copie du fichier à file.bkup?

  2.   
  3. A | A) instruction switch

  4.   
     

ls « répertoire $ » n'imprime pas la liste des répertoires pour l'utilisateur de voir   ?

#!/bin/bash
while $TRUE
do
        echo " Select one of the following options:"
        echo " d or D) Display today's date and time"
        echo " l or L) List the contents of the present working directory"
        echo " w or W) See who is logged in"
        echo " p or P) Print the present working directory"
        echo " a or A) List the contents of a specified directory"
        echo " b or B) Create a backup copy of an ordinary file"
        echo " q or Q) Quit this program"
        echo " Enter your option and hit <Enter>: \c"
        read option
        case "$option" in
                d|D) date
                     ;;
                l|L) ls pwd
                     ;;
                w|w) who
                     ;;
                p|P) pwd
                     ;;
                a|A) echo "Please specify the directory and hit <Enter>: \c"
                     read directory
                        if [ ! -d "$directory"  ]
                        then
                                while [ ! -d "$directory" ]
                                do
                                        echo "Usage: "$directory" must be a directory."
                                        echo "Specify the directory and hit <Enter>: \c"
                                        read directory

                                        if [ "$directory" = "q" -o "Q" ]
                                        then
                                        exit 0

                                        elif [ -d "$directory" ]
                                        then
                                                ls "$directory"

                                        else
                                        continue
                                        fi
                                done
                        fi
                        ;;
                b|B) echo "Specify the ordinary file for backup and hit <Enter>: \c"
                     read file
                        if [ ! -f "$file" ]
                         then
                                while [ ! -f "$file" ]
                                do 
                                        echo "Usage: "$file" must be an ordinary file."
                                        echo "Specify the ordinary file for backup and hit <Enter>: \c"
                                        read file
                                        if [ "$file" = "q" -o "Q" ]
then
                                        exit 0
                                        elif [ -f "$file" ]
                                        then
                                        cp $file $file.bkup
                                        fi
                                done
                        fi
                        ;;

                q|Q) exit 0
                     ;;

        esac
        echo
done
exit 0

Une autre chose ... est-il un éditeur que je peux utiliser le code auto-analyse syntaxique? I.e. quelque chose de similaire à NetBeans?

Était-ce utile?

La solution

Il vous manque un do après la deuxième while. (The 'B' affaire;. Comparer les cas que contre le 'A' au-dessus)

J'utilise vim qui syntaxe des scripts shell de mettre en évidence, mais je pense que vous devez poser des questions sur les éditeurs comme une autre question.


Quant à votre question modifiée: Votre logique est rompu dans les deux cas de A et B: vous devez tirer la logique de sauvegarde de votre si / alors que l'imbrication ... le if ne fait quoi que ce soit pour vous. Aussi, assurez-vous de citer tous vos noms de fichiers afin que les espaces ne cassent pas votre script. Oubliez vos citations imbriquées. Je crois que vous avez besoin d'une -e sur les états d'écho qui utilisent \c.

Alors faire quelque chose comme:

b|B) echo -e "Specify the ordinary file for backup and hit <Enter>: \c"
    read file
    while [ ! -f "$file" ]
    do 
        echo "Usage: \"$file\" must be an ordinary file."
        echo -e "Specify the ordinary file for backup and hit <Enter>: \c"
        read file
        if [ "$file" = "q" -o "$file" = "Q" ]
        then
            exit 0
        fi
    done
    cp "$file" "$file.bkup"
    ;;

Vous aurez besoin de faire le même genre de changement pour le cas A.

Autres conseils

Deux problèmes dans la section liste des répertoires A).

  1. La conjonction -o ne fonctionne pas comme vous pensez. Devrait être:

                if [ "$directory" = "q" -o "$directory" = "Q" ]
    
  2. Votre externe « si » a besoin d'un « autre » pour gérer le cas où le répertoire donné est vraiment un répertoire dès le départ.

La section de sauvegarde B) a les mêmes deux problèmes. Fixer ceux-ci, et les deux options de commande fonctionneront.

Vous avez cité la variable $file dans la plupart des endroits, mais dans la commande cp vous n'avez pas. Il devrait être:

cp "$file" "$file.bkup"

Certains de vos commandes de echo ont « \ c » à la fin. Je pense que ce spécifique à csh. Bash juste écho aux caractères "\" et "c" littéralement.

Votre while $TRUE déclaration fonctionne en vertu de la variable étant nulle ou hors service. Si elle se prépare à une certaine valeur, il essaiera d'exécuter le contenu comme une commande. Si vous voulez faire ce type de boucle infinie, il est généralement fait dans Bash comme ceci:

while true

où la vraie est une commande du shell. Ou:

while :

où le côlon est un no-op qui retourne vrai. Bien sûr, il y a d'autres façons de faire la même chose.

Dans le cas de l|L) vous voulez probablement faire soit:

ls

ou

ls $PWD

la façon dont vous l'avez maintenant, il va essayer de lister l'entrée d'un fichier nommé « passwd ».

Les deux vim et nano peuvent faire la coloration syntaxique pour Bash. Si elles ne sont pas déjà mis en place dans ~/.nanorc et ~/.vimrc vous pouvez faire ces:

pour nano:

nano -Y sh scriptname

Pour vim:

:syntax on
:set filetype=sh

1) vous ne pas utiliser tant d'échos .. pour créer un système de menu, vous pouvez utiliser le chat ici-document, par exemple

cat <<EOF
-------------------------------------------------------
Select one of the following options:
d or D) Display today's date and time
l or L) List the contents of the present working directory
w or W) See who is logged in
p or P) Print the present working directory
a or A) List the contents of a specified directory
b or B) Create a backup copy of an ordinary file
q or Q) Quit this program
--------------------------------------------------------
EOF

ou même cela fera

echo "-------------------------------------------------------
Select one of the following options:
d or D) Display today's date and time
l or L) List the contents of the present working directory
w or W) See who is logged in
p or P) Print the present working directory
a or A) List the contents of a specified directory
b or B) Create a backup copy of an ordinary file
q or Q) Quit this program
--------------------------------------------------------"

2) en demandant l'utilisation de choisir une option, vous pouvez utiliser lire avec -p, par exemple

read -p "Enter your option and hit <Enter>: " choice

3) printf est plus portable que l'écho, par conséquent, vous devriez l'utiliser autant que possible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top