2010-12-10 16 views
3

OS X 10.6.5, BASHEcho BASH Variablen zu überschreiben Text Problem

Als ich laufen diese:

echo $IP; echo of; echo $IPLINES 

ich diese Ausgabe:

219.80.4.150:3128 
of 
1108 

Als ich dies auszuführen:

echo $IP of $IPLINES 

Ich bekomme diesen Ausgang:

of 1108.150:3128 

ich erwartet zu bekommen:

219.80.4.150:3128 of 1108 

Was den verzerrten Ausgang Ich würde dazu führen, bin immer?

Das eigentliche Skript ist dies:

#!/bin/bash 

IPLINES=`cat a.txt | wc -l | awk '{print $1}'` 

if [ $IPLINES > 1 ]; then 
    LINE=`expr $RANDOM % $IPLINES + 1` 
    IP=`head -$LINE a.txt | tail -1` 
    sed -e "${LINE}d" -i .b a.txt 

    echo $IP of $IPLINES 
fi 

Antwort

9

Eine wilde Vermutung hier: Sie extrahieren die IP-Variable aus einer TXT-Datei - wenn das eine Windows-Datei ist oder im Windows-Stil codiert ist, enden Zeilen mit \r\n. Du nimmst die Zeilenschaltung weg, aber was ist, wenn es eine \r darin gibt, die dich zurück zum Anfang der Linie bringt?

Schnelle dreckige Lösung ohne Fragen: Verwenden Sie echo -n, es unterdrückt den Zeilenumbruch am Ende des gechlossenen Textes.

echo -n $IP; echo -n of; echo -n $IPLINES 

Wenn das Problem weiterhin besteht, ist es wahrscheinlich, was ich oben gesagt habe. Versuchen Sie, Trimm rechts $IP.

BEARBEITEN: habe den OSX Teil nicht gesehen, sorry. In OSX enden Zeilen mit \r - das muss das Problem sein.

+0

Rechts und rechts. Ich habe Zeilenende in meiner Datei geändert, Problem gelöst. Danke für -n, ich war mit dieser Flagge nicht vertraut. – zevlag

+3

Tatsächlich enden in OS X Zeilen typischerweise * nicht * mit \ r. Normalerweise sehen Sie das nur in Dateien von alten Legacy-Apps aus klassischen Mac OS-Tagen. –

+0

Sie können unerwünschte Zeichen auch mit 'tr' entfernen:' cleanline = "$ (echo $ zeile | tr -d '\ r')" ' – xonya

2

Es scheint, dass es einen Wagenrücklauf (\r) am Ende des $IP.