Bash Shell script Erreurs: ./myDemo: 56: Erreur de syntaxe: chaîne non terminée cité
-
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.
Il semble que dans le b | B) instruction switch
cp fichier $ file.bkup de $ ne en fait une copie du fichier à file.bkup?
A | A) instruction switch
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?
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).
-
La conjonction -o ne fonctionne pas comme vous pensez. Devrait être:
if [ "$directory" = "q" -o "$directory" = "Q" ]
-
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.