【问题标题】:Modifying a parameter pass to a script (Bash)修改传递给脚本的参数 (Bash)
【发布时间】:2011-09-09 19:22:30
【问题描述】:

我已经在 Google 上找了很长时间了,但找不到任何符合我需要/想做的事情。

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

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

这就是我想要的脚本结果。

【问题讨论】:

    标签: bash arguments


    【解决方案1】:

    要设置位置参数$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
    

    【讨论】:

    • 这是一个保护程序,但是,当第一个参数以破折号开头时,我建议使用“set --”来缓解问题。
    【解决方案2】:

    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
    

    大编辑:

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

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

    并从您的外壳中获取它。结果如下(我希望这是 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
    

    【讨论】:

    • 嗯,也许我遗漏了一些东西。我希望在调用脚本后发生什么,每次我回显列表时,我希望它也显示脚本所做的修改。这有意义吗?因此,如果我有 list="1:2:3:4" ./script list 5 程序将回显结果。然后每次我调用 echo list 1:2:3:4:5 都会得到结果。
    • 您必须将-q 添加到grep
    • @Op De Cirkel。我认为 device null 不会太在意。还是我错过了什么?
    • @yaegrbomb 你的意思是“./script list 5”还是“./script $list 5”?
    • @yaegrbomb 实际上,您的错误在通话中看起来像是多了一美元。请看我之前的评论。
    【解决方案3】:

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

    Arg1=$1
    

    然后,在你赋值的地方,将变量名上的 $ 省略到 = 的左侧

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多