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

7

我在谷歌上搜索了很长时间,但没能找到符合我需求的内容。

我的目标是编写一个脚本,它需要两个参数。该脚本将搜索第一个参数(即列表),并检测第二个参数是否已经存在于列表中。例如:

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个回答

13

使用set命令设置位置参数$1、$2、...

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
这是一个保护程序,但我建议使用“set --”来缓解当第一个参数以破折号开头时出现的问题。 - galaxy

3
adymitruk已经说过了,但你为什么想要给参数赋值呢?这样做不是也能达到效果吗?
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中获取源代码。结果如下(我希望这是所期望的内容):

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

嗯,也许我漏掉了什么。在脚本被调用后,我想要发生的事情是每次我回显列表时,我希望它也显示脚本所做的修改。这有意义吗?所以如果我有list="1:2:3:4" ./script list 5程序将回显结果。然后每次我调用echo list 1:2:3:4:5都会产生结果。 - yaegerbomb
@yaegerbomb 你是指"./script list 5"还是"./script $list 5"? - Hyperboreus
@Hyperboreus 这个练习要求:编写一个 shell 函数,它接受两个参数:1)一个 shell 变量的名称和 2)一个字符串,如果该字符串不是列表中的元素,则将其添加到该 shell 变量的值列表的开头。 - yaegerbomb
@yaegerbomb 好的,我又编辑了一遍。请告诉我现在是否正确。 - Hyperboreus
1
@yaegerbomb,实际上你的错误看起来是在调用中多了一个$符号。请查看我的早期评论。 - Hyperboreus
显示剩余7条评论

2

首先将参数复制到本地变量中:

Arg1=$1

那么,在赋值时,要将变量名左边的$去掉。

在赋值语句的左侧不能有$。如果有,它会将$1的内容解释为一个需要运行的命令。

希望这能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接