¿Escribir guiones con argumentos?

11

Quiero escribir un script de shell que tome un argumento y luego lo aplique a los archivos.

Específicamente, quiero dar un término, y luego hacer que compile term.as con mxmlc ("mxmlc term.as"), luego ejecute term.swf con flashplayerdebugger ("flashplayerdebugger term.swf"). Soy bastante nuevo en los scripts de shell, ¿alguna idea?

Southpointingchariot
fuente
$2es el primer argumento, $3el segundo, y así sucesivamente. $1está reservado para el nombre del archivo. En cuanto a las otras cosas, no entiendo lo que quieres decir. ¿Podrías intentar explicarlo un poco mejor o escribir un código psuedo?
fouric
1
@InkBlend estás fuera por uno. "$1"Es el primer argumento.
geirha
@geirha: Ay. Eso duele. Tienes razón, por supuesto. Tonto, debo haber estado pensando en Python.
fouric

Respuestas:

19

Podrías usar algo como esto:

#!/bin/sh
# $0 is the script name, $1 id the first ARG, $2 is second...
NAME="$1"
mxmlc $NAME.as
flashplayerdebugger $NAME.swf
Dawid
fuente
1
O omita la NAMEvariable por completo y simplemente use mxmlc "$1".asy flashplayerdebugger "$1".swf. (Las citas pueden estar dentro de expresiones.)
Eliah Kagan
pero ¿y si el parámetro contiene espacios?
Dawid
Tienes toda la razón. He editado mi comentario para corregir este error.
Eliah Kagan
@shinnra Si el parámetro contiene espacios, nxmlcy flashplayerdebuggerrecibirá varios argumentos en lugar de la intención de un argumento. La expansión de las NAMEnecesidades debe ser doblemente citada. En una nota al margen, no use todos los nombres de variables en mayúsculas; corre el riesgo de sobrescribir variables de shell especiales o variables de entorno.
geirha
4

También te recomiendo que uses el delimitador de nombre de variable. Entonces el código se vería así:

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

Esto permite el uso de la variable en cualquier contexto, incluso dentro de otro texto. Por ejemplo:

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

Esto expandiría la variable NAME que estaría flanqueada al frente por "myFileIs" y en la parte posterior con "y eso es todo" La variable se expandiría, espacios incluidos, dentro de la cadena. si NAME estuviera "dentro de aquí", el NewName sería "myFileIsinside hereand eso es todo".

La línea de comando puede tomar hasta 9 variables. Pueden ser cadenas entre comillas que contienen espacios en blanco, cada cadena entre comillas cuenta como una variable. Como:

./myProg var1 var 2 var3

Así ${1}es "var1", ${2}es "var", ${3}es "2", ${4}es"var3"

PERO: ./myProg var1 "var 2" var3

tiene ${1}es "var1", ${2}es "var 2", ${3}es"var3"

¡Que te diviertas!

Hola Gary
fuente