Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Modifying a parameter pass to a script (Bash)

Tags:

bash

arguments

I have been looking on Google for quite a while now and can't find anything that is matching what I need/want to do.

My objective is to write a script that takes two arguments. It will search through the first argument (which is a list) and detect if the second argument is already in it. For example:

list = /bin/foo:/bin/random:random

to add to list: /bin/foobar

Calling the script will produce the result of /bin/foo:/bin/random:random:/bin/foobar.

If the part to add to the list is already in the list then nothing will be changed of the original.

I have everything working up until the point where I want to modify the parameter I passed.

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

This however produced an error. It says that the command isn't found and gives me the line number that $1="$NEWLIST" is on. What am I doing wrong here? How do I modify $1? Thanks!

edit:

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

This is what I would want as a result of the script.

like image 614
yaegerbomb Avatar asked Jun 07 '11 05:06

yaegerbomb


2 Answers

To set the positional parameters $1, $2, ..., use the set command:

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

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

If you want to modify one positional parameter without losing the others, first store them in an array:

set foo bar baz
args=( "$@" )
args[1]="BAR"
set "${args[@]}"
echo "$*"   # ==> foo BAR baz
like image 81
glenn jackman Avatar answered Oct 28 '22 20:10

glenn jackman


adymitruk already said it, but why do you want to assign to a parameter. Woudln't this do the trick?

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

Maybe this:

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

BIG EDIT:

Use this script (called listadd for instance):

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

And source it from your shell. Result is the following (I hope this is what wsa intended):

lorenzo@enzo:~$ list=1:2:3:4
lorenzo@enzo:~$ source listadd list 3
lorenzo@enzo:~$ echo $list
1:2:3:4
lorenzo@enzo:~$ source listadd list 5
lorenzo@enzo:~$ echo $list
1:2:3:4:5
lorenzo@enzo:~$ list2=a:b:c
lorenzo@enzo:~$ source listadd list2 a
lorenzo@enzo:~$ echo $list2
a:b:c
lorenzo@enzo:~$ source listadd list2 d
lorenzo@enzo:~$ echo $list2
a:b:c:d
like image 41
Hyperboreus Avatar answered Oct 28 '22 21:10

Hyperboreus