代码之家  ›  专栏  ›  技术社区  ›  dpatchery

shell脚本在第二次运行时使用第一次运行的参数

  •  1
  • dpatchery  · 技术社区  · 16 年前

    我正在一个KornShell中操作,并尝试运行我编写的一个简单的chdb脚本。如果不带参数运行,它将向用户提示数据库列表并等待选择。如果使用单个数字参数调用,它将自动为用户进行选择。

    例子:

    > . chdb
    Select the database sid from the following:
      1) testdb1
      2) testdb2
      3) testdb3
    
    Selection: 2 <-- user entered
    
    Environment is now set up for testdb2.
    >. chdb 2
    Environment is now set up for testdb2.
    >
    

    我的问题是,当我使用上面提到的参数运行脚本,然后尝试在没有参数的情况下再次运行它时,它仍然使用旧的参数。

    例子:

    > . chdb 2
    Environment is now set up for testdb2.
    > . chdb
    Environment is now set up for testdb2.
    >
    

    编辑:我使用点是因为我正在环境中设置变量,不想调用子shell实例,否则数据库设置将无法工作。我有一种感觉,这可能是我的问题的根源,但我不确定如何解决它。

    另一件值得一提的事情是,用至少一个参数调用我的脚本将始终按预期工作。它从不使用以前输入的参数,除非在没有参数的情况下调用它。

    4 回复  |  直到 11 年前
        1
  •  1
  •   maxwellb    16 年前

    尝试:后 input=$arg 做一个 unset arg 或引用 if [["$#" -ne "1"]]

        2
  •  1
  •   Dermot Canniffe    11 年前

    如果使用带有“.”的脚本来设置环境变量,则该脚本中声明的任何变量都将自动成为全局变量,并传递到调用shell的会话中。

    有三种方法可以隔离变量并使其非持久化:

    1。初始化变量

    如果使用单个变量捕获用户选择,例如dbselection,无论是在命令行上传递还是在交互模式下输入,那么您可能希望通过将该变量初始化为空字符串来启动脚本;

    DBSELECTION=""
    if [ "$1ZZZ" != "ZZZ" ] ; then 
        DBSELECTION=$1
    else
        interactiveMode
    fi
    

    ——何处 “交互模式” 是您定义的获取用户选择的过程。当然,您的方法或函数名可能会有所不同。

    2。未设置变量

    如果使用临时变量来注册用户选择(如上面的dbselection),则可能需要在脚本末尾取消设置变量;

    DBSELECTION=""
    if [ "$1ZZZ" != "ZZZ" ] ; then 
        DBSELECTION=$1
    else
        interactiveMode
    fi
    unset DBSELECTION
    

    三。定义局部变量而不是全局变量

    如果您使用的是临时变量,那么最好在本地(使用类型集)而不是全局定义它们,这样它们就不会持久于定义它们的函数之外。

    typeset DBSELECTION=""
    if [ "$1ZZZ" != "ZZZ" ] ; then 
        DBSELECTION=$1
    else
        interactiveMode
    fi
    

    这样,ksh将为您处理变量,而不是自己显式地取消设置它。

        3
  •  0
  •   jim mcnamara    16 年前

    另外,您正在运行代码“source”,这意味着当您再次运行脚本时,脚本中声明的所有环境变量仍然存在。

    尝试

    /CHDB

    而不是

    . CHDB

        4
  •  0
  •   dpatchery    16 年前

    我想出了一个办法来解决这个问题。我补充说 set -- 在我的脚本末尾,这样它就取消了所有的参数。

    对于其他有同样问题的人, 集合—— 清除所有参数($1、$2、$3等)。使用 shift 只删除第一个($1),或 shift num 取消设置第一个 num 争论。随之而来的是 shift $# 也将清除所有参数。