2010-12-18 5 views
0

Ich habe ein Skript geschrieben die Unix-Shell-Sprache (nicht in Bash oder eine andere Shell, in SH), die den Mount-Punkt eines bestimmten USB (dh es nimmt den Pfad eines USB (z als/dev/sdb1) als Argument). Hier ist sie:Problem Druck Zeichenfolge in der Shell

#!/bin/sh 
# usage: get_mount [path] 
# returns: mount pount of given usb path 

pth=$1 
echo $pth 
mountPoint="`df -h | grep $pth | tr -s \" \"| cut \"-d \" -f6`" 
echo $mountPoint 

Das Problem ist, wenn ich dies ausführen, druckt es nur eine leere Zeichenfolge, und ich kenne den Befehl funktioniert, weil ich es in einem Terminal ohne Probleme ausprobiert habe: es ist die Zuweisung es einfach zu einer Variable ist, was nicht funktioniert. Hat jemand Ideen? Danke im Voraus!

+0

Dieses Skript funktionierte mit dem einzigen Gerät auf meinem System "df -h" (/ dev/fd). Können Sie bitte den relevanten Teil der Ausgabe von Ihrem 'df -h' veröffentlichen? – DVK

+0

Können Sie uns eine Beispieleingabe und gewünschte Ausgabe geben? Ich bin ziemlich sicher, dass Sh eine bestimmte Anzahl von Parameter Expansion Techniken haben wird, um die Notwendigkeit für tr und/oder Schnitt vollständig zu entfernen – SiegeX

Antwort

2

Sie werden Ihr Leben vereinfachen, indem sie effektive Nutzung von einfachen Anführungszeichen sowie doppelte Anführungszeichen zu machen.

mountPoint="`df -h | grep $pth | tr -s ' ' | cut -d' ' -f6`" 

Der erste Schritt bei der Fehleranalyse ist es, den cut Befehl zu entfernen und sehen, was es produziert:

mountPoint="`df -h | grep $pth | tr -s ' '`" 
echo $mountPoint 

Druckt es noch 6 (oder mehr) Spalten?

Beachten Sie, dass die grep nichts an die weitergibt, wenn Sie das Argument zu dem Befehl falsch schreiben.

Auf meinem Rechner (Mac), erhalte ich die Ausgabe von df -h:

Filesystem  Size Used Avail Capacity Mounted on 
/dev/disk0s2 465Gi 189Gi 277Gi 41% /
devfs   111Ki 111Ki 0Bi 100% /dev 
map -hosts  0Bi 0Bi 0Bi 100% /net 
map auto_home 0Bi 0Bi 0Bi 100% /home 
/dev/disk1s1 1.8Gi 8.8Mi 1.8Gi  1% /Volumes/BLACKBERRY 

Beachten Sie, dass einige der Dateisystemnamen in ihnen Räume. Es ist unwahrscheinlich, dass es ein Faktor in Ihrem Problem ist, aber es könnte Dinge wegwerfen (der Einhängepunkt ist dann Feld 7).

+0

Auf Solaris gibt df -h 2-Zeilen-Ausgabe pro Mount-Punkt – DVK

+0

Vielen Dank! Ich erinnere mich, dass ich versucht habe, auch einfache Anführungszeichen zu verwenden, und es funktioniert nicht, aber aus irgendeinem Grund tut es das jetzt ... Danke trotzdem! –

+0

@DVK: zwei Zeilen Ausgabe pro FS würde auch Dinge vermasseln - aber das OP sagt, dass es von der Kommandozeile aus funktioniert ... –

0

Bewegen Sie den \“vor dem -d in Schnitt nach der -d

mountPoint="`df -h | grep $pth | tr -s \" \"| cut -d \" \" -f6`" 
+1

Das ist es nicht; Mit diesem Zitat wird angegeben, dass das Feldtrennzeichen leer ist. –

+0

Ich reparierte das, @ Jonathan. –

+0

Yep ... aber das Argument zu dem '-d' kann daran angehängt werden, und die ursprüngliche Notation in der Frage erreicht das mit' "-d" ', um das Leerzeichen als Argument an' -d' zu übergeben. Ich denke in Bezug auf "-d", aber das Original war in Ordnung, wenn auch nicht in einer Form, die ich in meinen eigenen Skripten verwenden würde. –