• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[GELÖST] tr -d Zeichen von einem String abtrennen in /etc/

Hallo, bei mir funktioniert "tr" in dem Ordner /etc/ und deren Unterordner irgendwie nicht richtig. Beim Befüllen einer Variable INSTNOp wie folgt gibt er dort Buchstaben, statt ?? aus. In /opt/sap hingegen funktioniert alles bestenst. Ist die Datei die in PROFILES Gefüllt wird hingegen vorhanden und sind in den Platzhaltern <??> Nummernwerte vorhanden, dann funktioniert das Abtrennen der Zeichen auch unter /etc/ und bleiben dann in der Variable INSTNOp die Ziffern stehen. Warum verhält sich "tr" im Zusammenspiel mit dem Befüllen einer variable unter /etc/... anders, als unter /opt/sap?! Wenn ich nur "echo $INSTNO | tr -d 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" ausführe, gibt er mir Fragezeichen aus, schiebe ich diese in die Variable INSTNOp, bekomme ich unter /etc/... in jedem Verzeichnis eine intividuelle zweistellige Buchstabenfolge.

host:/etc/init.d # PROFILES=`echo /usr/sap/SID/SYS/profile/SID_DVEBMGS??_"$HOSTNAME"`
host:/etc/init.d # INSTNO=`echo $PROFILES | awk -F_ '{print $2}'`
host:/etc/init.d # echo $INSTNO
DVEBMGS??
host:/etc/init.d # INSTNOp=`echo $INSTNO | tr -d 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
host:/etc/init.d # echo $INSTNOp
rc
host:/etc/init.d # cd.
-bash: cd.: command not found
host:/etc/init.d #
host:/etc/init.d # cd ..
host:/etc # PROFILES=`echo /usr/sap/SID/SYS/profile/SID_DVEBMGS??_"$HOSTNAME"`
host:/etc # INSTNO=`echo $PROFILES | awk -F_ '{print $2}'`
host:/etc/init.d # echo $INSTNO
DVEBMGS??
host:/etc # INSTNOp=`echo $INSTNO | tr -d 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
host:/etc # echo $INSTNOp
vx
host:/etc # cd /opt/sap
host:/opt/sap # PROFILES=`echo /usr/sap/SID/SYS/profile/SID_DVEBMGS??_"$HOSTNAME"`
host:/opt/sap # INSTNO=`echo $PROFILES | awk -F_ '{print $2}'`
host:/etc/init.d # echo $INSTNO
DVEBMGS??
host:/opt/sap # INSTNOp=`echo $INSTNO | tr -d 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
host:/opt/sap # echo $INSTNOp
??
host:/opt/sap #
 
A

Anonymous

Gast
Das Problem liegt hier
Code:
echo $INSTNOp
wenn da in der Variable "??" drinnen steht, dann versucht die Shell hier ein Filenameexpansion und sucht Dateien mit genau zwei Zeichen und der erste dieser Dateinamen wird dann mit echo ausgegeben. (andere echo-Kommandos können auch alle ausgeben. zB Solaris) Steht in dem aktuellen Verzeichnis keine Datei die aus 2 Zeichen besteht dann wird ?? ausgegeben.

Kannst du auch überprüfen, gehe in verschiedene Verzeichnisse und gebe
Code:
echo ??
dort ein.

das Ganze kannst du ganz leicht verhindern
Code:
echo "$INSTNOp"

robi
 
Also, wenn die Variable zwei Fragezeichen enthält, dann gibt sie mit Echo die Dateien, die sie zweistellig findet aus. Und wie verhindere ich das nun, durch das setzen der Hochkommata?

jup, geht jetzt mit "$INSTNO" statt $INSTNO.

Code:
        set_instance_type()
        {
                PROFILES=`echo /usr/sap/$1/SYS/profile/$1_DVEBMGS??_"$HOSTNAME"`
                INSTNO=`echo $PROFILES | awk -F_ '{print $2}' | tr -d 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
                if [ ! "$INSTNO" = '??' ]; then
                        INSTTYPE=CENTRAL
                else
                        PROFILES=`echo /usr/sap/$1/SYS/profile/$1_JC??_"$HOSTNAME"`
                        INSTNO=`echo $PROFILES | awk -F_ '{print $2}' | tr -d 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
                        if [ ! "$INSTNO" = '??' ]; then
                                INSTTYPE=JAVA
                        else
                        PROFILES=`echo /usr/sap/$1/SYS/profile/$1_SCS??_"$HOSTNAME"`
                        INSTNO=`echo $PROFILES | awk -F_ '{print $2}' | tr -d 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
                                if [ ! "$INSTNO" = '??' ]; then
                                        INSTTYPE=SCS
                                else
                                        PROFILES=`echo /usr/sap/$1/SYS/profile/$1_D??_"$HOSTNAME"`
                                        INSTNO=`echo $PROFILES | awk -F_ '{print $2}' | tr -d 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
                                        if [ ! "$INSTNO" = '??' ]; then
                                                INSTTYPE=DIALOG
                                        else
                                                INSTTYPE=UNKNOWN
                                        fi
                                fi
                        fi
                fi
        }
 
A

Anonymous

Gast
mulle78 schrieb:
Und wie verhindere ich das nun, durch das setzen der Hochkommata?
Hab jetzt nur Solaris hier und da würde das mit den Hochkommas funktionieren. Da es aber auch Bash ist, würde ich behaupten, das sollte in Linux genauso gehen, da dann die Reihenfolge der Interpretation und Expansion der Shell die gleiche sein sollte.

robi
 
thx... wie oben geschrieben... funktioniert mit Hochkommatas einwandfrei. Mit etwas Erfahrung hätte man selbst drauf kommen können, gerade wo ich die Platzhalter ?? ja in dem Script genau für diesen Zweck, eine Datei zu finden, nutze.
 
Oben