2011-06-07 14 views
5

He estado buscando en Google desde hace un tiempo y no encuentro nada que coincida con lo que necesito/quiero hacer.Modificar un paso de parámetro en un script (Bash)

Mi objetivo es escribir una secuencia de comandos que tiene dos argumentos. Buscará a través del primer argumento (que es una lista) y detectará si el segundo argumento ya está en él. Por ejemplo:

list =/bin/foo:/bin/al azar: al azar

a añadir a la lista:/bin/foobar

llamar al script producirá el resultado de/bin/foo:/bin/random: random:/bin/foobar.

Si la parte para agregar a la lista ya está en la lista, entonces no se cambiará nada del original.

Tengo todo funcionando hasta el punto en que quiero modificar el parámetro que pasé.

... 
if [ $RUN = 1 ]; then 
    echo $1 
else 
    $1="$NEWLIST" 
fi 
exit 0 

Esto sin embargo produjo un error. Dice que el comando no se encuentra y me da el número de línea en el que $ 1 = "$ NEWLIST" está activado. ¿Qué estoy haciendo mal aquí? ¿Cómo modifico $ 1? ¡Gracias!

edición:

$ PATH=/opt/bin:$PATH 
$ ./scrip.sh PATH /user/opt/bin 
$ /opt/bin:/user/opt/bin 

Esto es lo que yo quiero, como resultado de la secuencia de comandos.

Respuesta

2

adymitruk ya lo dijo, pero ¿por qué hay que asignar a un parámetro. ¿Esto no funciona?

if `echo :$1: | grep ":$2:" 1>/dev/null 2>&1` 
then 
    echo $1 
else 
    echo $1:$2 
fi 

Tal vez esto:

list="1:2:3:4" 
list=`./script $list 5`;echo $list 

EDITAR GRANDE:

uso de este script (llamado listadd por ejemplo):

if ! `echo :${!1}: | grep ":$2:" 1>/dev/null 2>&1` 
then 
    export $1=${!1}:$2 
fi 

Y fuente de tu concha.El resultado es el siguiente (espero que esto es lo que WSA dicho):

[email protected]:~$ list=1:2:3:4 
[email protected]:~$ source listadd list 3 
[email protected]:~$ echo $list 
1:2:3:4 
[email protected]:~$ source listadd list 5 
[email protected]:~$ echo $list 
1:2:3:4:5 
[email protected]:~$ list2=a:b:c 
[email protected]:~$ source listadd list2 a 
[email protected]:~$ echo $list2 
a:b:c 
[email protected]:~$ source listadd list2 d 
[email protected]:~$ echo $list2 
a:b:c:d 
+0

Hrmm tal vez dejé algo fuera. Lo que quiero que suceda después de que se llame el guión es que cada vez que hago eco de la lista quiero que también muestre la modificación que hizo el guión. ¿Eso tiene sentido? Entonces si tuviera list = "1: 2: 3: 4" ./script list 5 el programa hará eco del resultado. Luego cada vez que llamo a lista de eco 1: 2: 3: 4: 5 resultará. – yaegerbomb

+0

tienes que agregar '-q' a' grep' –

+0

@Op De Cirkel. No creo que al dispositivo nulo le importe mucho. ¿O me estoy perdiendo algo? – Hyperboreus

2

primera copia sus parámetros a las variables locales:

Arg1=$1 

Entonces, donde está asignando dejar fuera de la $ en el nombre de la variable a la izquierda de los =

No se puede tener un $ en el lado izquierdo de una tarea. Si lo hace, es interpretar el contenido de $ 1 como un comando para ejecutar

esperanza esto ayuda

8

Para establecer los parámetros de posición $1, $2, ..., utilice el comando set:

set foo bar baz 
echo "$*" # ==> foo bar baz 
echo $1  # ==> foo 

set abc def 
echo "$*" # ==> abc def 

Si desea modificar un parámetro posicional sin perder los otros, primero guárdelos en una matriz:

set foo bar baz 
args=("[email protected]") 
args[1]="BAR" 
set "${args[@]}" 
echo "$*" # ==> foo BAR baz 
+1

Esto es un protector, sin embargo, aconsejaría usar "set -" para mitigar un problema cuando el primer argumento comience con un guion. – galaxy

+0

¿No debería ser esta la respuesta aceptada? –

Cuestiones relacionadas