BASH: supprime les caractères de nouvelle ligne de la chaîne (ligne de lecture)
Je suis tombé sur le problème suivant: je suis en train d'écrire un Linux script bash qui fait ce qui suit:
- Ligne de lecture à partir d'un fichier
- Bande de la
\n
caractère de fin de ligne viens de lire - Exécuter la commande qui est là
Exemple:
commands.txt
ls
ls -l
ls -ltra
ps as
L'exécution du fichier bash doit obtenir la première ligne, et de l'exécuter, mais alors que le \n
présent, l'enveloppe juste sorties de la commande "non trouvé: ls"
La partie du script qui ressemble à ceci
read line
if [ -n "$line" ]; then #if not empty line
#myline=`echo -n $line | tr -d '\n'`
#myline=`echo -e $line | sed ':start /^.*$/N;s/\n//g; t start'`
myline=`echo -n $line | tr -d "\n"`
$myline #execute it
cat $fname | tail -n+2 > $fname.txt
mv $fname.txt $fname
fi
Commenté vous avez des choses que j'ai essayé avant de demander. Toutes les solutions? Je suis brisant mon cerveau pour le dernier couple d'heures sur ce...
source d'informationauteur Bogdan Constantinescu
Vous devez vous connecter pour publier un commentaire.
J'aime toujours
perl -ne 'chomp and print'
, pour la coupe des sauts de ligne. Agréable et facile à retenir.par exemple
ls -l | perl -ne 'chomp and print'
Cependant
Je ne pense pas que c'est votre problème ici. Bien que je ne suis pas sûr de comprendre comment vous passez les commandes dans le fichier grâce à la "lecture" dans votre script shell.
Avec un script de test de mon propre comme ceci (test.sh)
et un exemple de fichier d'entrée comme ceci (test.cmd)
Si je le lance comme ça
./test.sh < test.cmds
je vois le résultat escompté, qui est l'exécution de la première commande " ls " sur le répertoire de travail courant.Peut-être que votre fichier d'entrée a des caractères non-imprimables ?
le mien ressemble à ça
De vos commentaires ci-dessous, je soupçonne que vous pourriez avoir des retours chariot ( "\r" ) dans votre fichier d'entrée, ce qui n'est pas la même chose qu'un retour à la ligne. Est le fichier d'entrée à l'origine en format DOS ? Si oui, alors vous avez besoin de convertir les 2 octets DOS de fin de ligne "\r\n" pour le seul octet d'UNIX, "\n" pour atteindre les résultats attendus.
Vous devriez être capable de faire cela en échangeant le "\n" "\r" dans un de vos commenté les lignes.
Quelqu'un l'a déjà écrit un programme qui permet d'exécuter des commandes shell: sh fichier
Si vraiment vous ne voulez exécuter la première ligne d'un fichier:
head -n 1 file |sh
Si votre problème est le transport-retour:
tr -d '\r' <file |sh
J'ai essayé ceci:
Pour l'entrée "xxxx", j'obtiens:
Comme vous pouvez le voir, il n'y a pas de
\n
à la fin du contenu de la variable. Je suggère d'exécuter le script avec l'option-x
(bash -x script
). Cela permettra d'imprimer toutes les commandes, ils sont exécutés.[MODIFIER] le problème est que vous avez modifié commands.txt sur Windows. Maintenant, le fichier contient CRLF (0d0a) comme la ligne délimiteurs qui confond
read
(etls\r
n'est pas connu de commande). Utilisationdos2unix
ou similaire pour le transformer en un fichier Unix.Vous pouvez également essayer de remplacer les retours chariot avec des sauts de ligne uniquement à l'aide de Bash les builtins:
vous avez besoin d'eval de commande
J'ai couru comme
./script.sh < file.txt
Et file.txt a:
bien que ne travaillant pas pour le
ls
je vous recommande de jeter un oeil surtrouver
’s-print0
optionLe script suivant fonctionne (au moins pour moi):