修改参数传递给脚本(Bash)

时间:2011-06-07 05:57:53

标签: bash arguments

我一直在谷歌上看了很长一段时间,找不到任何符合我需要/想做的东西。

我的目标是编写一个带有两个参数的脚本。它将搜索第一个参数(这是一个列表)并检测第二个参数是否已经在其中。例如:

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

添加到列表:/ bin / foobar

调用脚本将产生/ bin / foo:/ bin / random:random:/ bin / foobar的结果。

如果要添加到列表中的部分已经在列表中,则不会更改原始部分。

我一直在努力,直到我想要修改我传递的参数。

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

然而这产生了错误。它说找不到命令,并给我一个$ 1 =“$ NEWLIST”的行号。我在这做错了什么?如何修改$ 1?谢谢!

编辑:

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

这是我想要的脚本结果。

3 个答案:

答案 0 :(得分:10)

要设置位置参数$1, $2, ...,请使用set命令:

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

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

如果要修改一个位置参数而不丢失其他位置参数,请先将它们存储在一个数组中:

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

答案 1 :(得分:3)

adymitruk已经说过了,但你为什么要分配一个参数。 Woudl不会这样做吗?

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

也许这个:

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

BIG EDIT:

使用此脚本(例如,名为listadd):

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

从你的shell中获取它。结果如下(我希望这是wsa的目的):

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

答案 2 :(得分:2)

首先将参数复制到局部变量:

Arg1=$1

然后,在=

左侧的变量名称上分配$

你不能在作业的左侧有$。如果这样做,它会将$ 1的内容解释为运行命令

希望这会有所帮助