Entfernen Sie Letzte argument aus der Argumentliste, der shell-script (bash)
Diese Frage betrifft ein bash-Skript, das im automator unter osx. Ich bin mit automator-Aktionen und-filter eine Reihe von Datei-Referenzen aus dem finder. Dann habe ich anfügen, dass die Liste die Namen der übergeordneten Ordner auch über eine automator-Aktion. Automator speist dann diese Argumente zu einer Aktion namens "run shell script". Ich bin nicht sicher, genau, wie automator startet das Skript, aber die argument-Liste sieht wie folgt aus, wenn echo mit: echo "$@"
/Volumes/G-Raid/Online/WAV_TEST/Testbok 50/01/01000 43-001.wav /Volumes/G-Raid/Online/WAV_TEST/Testbok 50/02/02000 43-002.wav /Volumes/G-Raid/Online/WAV_TEST/Testbok 50/03/03000 43-003.wav /Volumes/G-Raid/Online/WAV_TEST/Testbok 50
In diesem Fall Weg zu 3 Dateien und ein Ordner.
In das shell-Skript starte ich eine Anwendung namens ripcheckc* mit den args übergeben von automator minus das Letzte argument(den Ordner) in der Liste.
Ich dieses entfernen das Letzte argument:
_args=( "$@" )
unset _args[${#_args[@]}-1]
Und das ist echo $_args
:
/Volumes/G-Raid/Online/WAV_TEST/Testbok 50/01/01000 43-001.wav /Volumes/G-Raid/Online/WAV_TEST/Testbok 50/02/02000 43-002.wav /Volumes/G-Raid/Online/WAV_TEST/Testbok 50/03/03000 43-003.wav
Gleiche wie vorher, aber ohne den Ordner.
Nun, wenn ich ripcheckc mit "$@"
als argument, es funktioniert (aber scheitert später auf, weil der Letzte Weg, der in der argument-Liste), Wenn ich ${_args[@]}
die Anwendung einfach Abbrechen, schweigend. Wenn ich echo $@
und _args
die Ausgabe sieht identisch, außer für das Letzte argument.
Meine Frage ist - was ist der Unterschied zwischen $@ und $_args, dass die erste gültige Eingabe und die zweite nicht?
*Die Anwendung ist ripcheckc
Ich hoffe, dass meine Frage Sinn macht.
EDIT: Gelöst.
InformationsquelleAutor Nordanfors | 2013-12-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, dass Sie bereits ein
array
können Sie sagen:Zum Beispiel, wenn Ihr Skript enthält:
aufrufen, indem Sie behauptete:
bash scriptname foo bar baz
zurückkehren würde:Versuchen Weitergabe
${array[@]}
auf Ihre Bewerbung.Ich habe versucht, was Sie vorgeschlagen, aber noch nicht gehen. Fyi, ich habe meinen nick zu Nordanfors. 🙂
Zitat von Variablen.
Die nächste Antwort, die akzeptiert werden sollten, nicht diese. Es ist dreifach die upvotes.
InformationsquelleAutor devnull
Habe ich dieses
bash
one-liner vorSetzt es das argument-Liste in die aktuelle Liste von Argumenten, quasi das Letzte argument.
Wie es funktioniert:
$#
ist die Anzahl der Argumente$((...))
ist ein arithmetischer Ausdruck, so$(($#-1))
ist um eins kleiner als die Anzahl der Argumente.${variable:position:count}
ist ein substring-Ausdruck: es extrahiertcount
Zeichen vonvariable
beginnend bei position. In der Sonderfall wovariable
ist@
, was bedeutet, dass die Argumentliste extrahiertcount
Argumente aus der Liste Anfang anposition
. Hierposition
ist1
für das erste argument undcount
ist um eins kleiner als die Anzahl der Argumente geklappt bisher.set -- arg1...argn
setzt die Liste der Argumente der gegebenen ArgumenteAlso das Endergebnis ist, dass die argument-Liste durch eine neue Liste, wo die neue Liste ist die ursprüngliche Liste, außer dem letzten argument.
Könnte ich bitte ein play-by-play von dieser Sache?
Ich habe geändert, die Antwort, eine Erklärung für Sie. Ich hoffe, es hilft.
Das ist perfekt!
InformationsquelleAutor starfry
Erhalten Sie auch alle, aber das Letzte argument mit
welche, ehrlich gesagt, ist ein wenig lückenhaft, da es zu sein scheint (ab)mit der Tatsache, dass Argumente, die sind durchnummeriert, beginnend bei 1, nicht 0.
Update: Dies funktioniert nur aufgrund eines Fehlers (behoben in 4.1.2 spätestens) im Umgang mit
$@
. Es funktioniert in der version 3.2."${@:1:${#}-1}"
ist genau das, was macht die vollständige Liste der Argumente wie in "$@" ohne die Letzte.Recht. Die skizzenhafte Teil ist mit 0 als erstes argument zu vermeiden, subtrahieren Sie 1 aus der zweiten.
Tatsächlich, index 0 enthält nicht-argument - Pfad an das Skript ausgeführt wird (ein Wert automatisch zur Verfügung gestellt von shell). Sie sind nicht zu vermeiden Subtraktion von 1 - das Letzte argument ist immer noch vorhanden und Sie müssen subtrahieren Sie 1. Mit 0 ist einfach das hinzufügen eines weiteren (wahrscheinlich nicht erforderlich) Wert der Liste.
Es wäre angezeigt, dies in
bash
3.2 aufgrund eines Fehlers, wurde in der Folge behoben.InformationsquelleAutor chepner