
Ich versuche, ein Shell-Skript zu erstellen. Ich möchte einen String mit dem Unix-Befehl „cut“ wie folgt ausschneiden:
namecmpaux=$(echo $namecmp |cut -c0-19)
Aber beim Ausführen zeigt die Shell den folgenden Fehler an:
cut: fields and positions are numbered from 1
Try `cut - help 'for more information.
Ich erinnere mich, dass ich vorher den Befehl „cut“ mit Null als untere Grenzposition verwendet habe, aber jetzt bekomme ich die Meldung, dass der Befehl bei 1 beginnen soll. Warum? Hängt vom Betriebssystem ab? Früher habe ich SunOS verwendet und jetzt verwende ich Ubuntu 12.04
Antwort1
Nein, das ist in jeder Implementierung gleich cut
. Zahlen beginnen bei eins, aber die Implementierung von Solaris beschwert sich nicht, wenn Sie 0 angeben, und behandelt es als 1. Sowohl 0
und 1
dort bedeutet das erste Zeichen als auch 2
das zweite Zeichen:
$ echo test | cut -c 0-2
te
$ echo test | cut -c 1-2
te
busybox
cut
oder das cut
eingebaute in, ksh93
beschweren Sie sich auch nicht. GNU cut
versucht nur, Ihnen zu helfen, indem es Ihnen sagt, dass Sie wahrscheinlich nicht die richtige Vorstellung davon haben, was der erste Index ist.
Ein echter Unterschied besteht jedoch darin, dass GNU und Busybox cut
(zumindest seit 27.03.2014) in Bytes zählen -c
, während Solaris oder ksh cut
in Zeichen zählen (wie von POSIX gefordert).
$ echo 'Stéphane' | cut -c 1-4
Sté
$ echo 'Stéphane' | busybox cut -c 1-4
Sté
$ echo 'Stéphane' | ksh -c 'command /opt/ast/bin/cut -c 1-4'
Stép
(in einem UTF-8-Gebietsschema benötigt é (U+00E9) 2 Bytes)
Antwort2
Ja, das könnte tatsächlich vom Betriebssystem abhängen (oder eher davon, wer Ihre Version von geschrieben hat cut
).
Wenn Sie einen Blick auf werfen man cut
, werden Sie feststellen, dass cut
GNU coreutils
Bytes, Zeichen und Felder ab 1 zählt:
Verwenden Sie genau eines der folgenden Elemente: -b, -c oder -f. [...] Jeder Bereich ist eines von:
N N'tes Byte, Zeichen oder Feld, gezählt ab 1
Auch hier kann es auf einem anderen System anders sein, wenn sich dessen Betreuer für eine andere als die GNU-Implementierung entschieden haben cut
. Gehen Sie also lieber auf Nummer sicher und werfen Sie zur Sicherheit einen Blick auf die Manpage.
Antwort3
Unter Linux hat es vorher sogar funktioniert. Ich wurde einfach davon genervt (unter Debian, nach einem Update des Coreutils-Pakets, das den Cut-Befehl enthält) und habe diesen Fehler gefunden.
Es ist ein Fehler in den Coreutils:
https://bugs.launchpad.net/ubuntu/+source/coreutils/+bug/211262
Jemand hat die Abwärtskompatibilität absichtlich kaputt gemacht und niemand hat es behoben. Früher war auch 0 in Ordnung und wurde als 1 behandelt. Jetzt erzeugt 0 einen Fehler. Alle Skripte, die von diesem Verhalten abhängen, sind also kaputt und müssen geändert werden.