Pisanie skryptów z argumentami?

11

Chcę napisać skrypt powłoki, który pobiera argument, a następnie stosuje go do plików.

W szczególności chcę podać termin, a następnie zlecić mu skompilowanie term.as z mxmlc („mxmlc term.as”), a następnie uruchomić term.swf z programem flashplayerdebugger („flashplayerdebugger term.swf”). Jestem całkiem nowy w skryptowaniu powłoki - jakieś myśli?

southpointingchariot
źródło
$2to pierwszy argument, $3drugi i tak dalej. $1jest zarezerwowany dla nazwy pliku. Co do innych rzeczy, nie do końca rozumiem, co masz na myśli. Czy mógłbyś spróbować wyjaśnić to trochę lepiej lub napisać kod psuedocode?
Fouric
1
@InkBlend jesteś wyłączony o jeden. "$1"to pierwszy argument.
geirha
@geirha: Ouch. To boli. Oczywiście masz rację. Głupia ja, chyba myślałam o Pythonie.
Fouric

Odpowiedzi:

19

Możesz użyć czegoś takiego:

#!/bin/sh
# $0 is the script name, $1 id the first ARG, $2 is second...
NAME="$1"
mxmlc $NAME.as
flashplayerdebugger $NAME.swf
Dawid
źródło
1
Lub NAMEcałkowicie pomiń zmienną i po prostu użyj mxmlc "$1".asi flashplayerdebugger "$1".swf. (Cytaty mogą być wewnątrz wyrażeń.)
Eliah Kagan
ale co jeśli parametr zawiera spacje?
Dawid
Masz w zasadzie rację. Zedytowałem swój komentarz, aby naprawić ten błąd.
Eliah Kagan
@shinnra Jeśli parametr zawiera spacje, wówczas nxmlci flashplayerdebuggerotrzyma wiele argumentów zamiast zamierzonego jednego argumentu. Ekspansja NAMEmusi być podwójnie cytowana. Na marginesie, nie używaj wszystkich nazw zmiennych wielkich liter; ryzykujesz zastąpienie specjalnych zmiennych powłoki lub zmiennych środowiskowych.
geirha
4

Polecam również użycie ogranicznika nazwy zmiennej. Tak więc kod wyglądałby następująco:

#!/bin/sh
# $0 is the script name, $1 id the first ARG, $2 is second...
NAME="$1"
mxmlc ${NAME}.as
flashplayerdebugger ${NAME}.sw

Pozwala to na użycie zmiennej w dowolnym kontekście, nawet w innym tekście. Na przykład:

NewName="myFileIs${NAME}and that is all"

Spowodowałoby to rozwinięcie zmiennej NAME, która byłaby flankowana z przodu przez „myFileIs”, a z tyłu z „i to wszystko”. Zmienna rozwijałaby się, łącznie ze spacjami, wewnątrz ciągu. jeśli NAZWA byłaby „wewnątrz tutaj”, NowaNazwa brzmiałaby „myFileIsinside tutaj i to wszystko”.

Wiersz poleceń może przyjąć do 9 zmiennych. Mogą być cytowanymi ciągami znaków, które zawierają spacje, każdy cytowany ciąg liczy się jako zmienna. Jak na przykład:

./myProg var1 var 2 var3

Tak ${1}jest "var1", ${2}jest "var", ${3}jest "2", ${4}jest"var3"

ALE: ./myProg var1 "var 2" var3

ma ${1}jest "var1", ${2}jest "var 2", ${3}jest"var3"

Baw się dobrze!

Hej Gary
źródło