2010-06-29 159 views
1

我在Korn Shell中运行,并试图运行我编写的简单chdb脚本。如果在没有参数的情况下运行,它会提示用户列出数据库并等待选择。如果使用单个数字参数调用,它将自动为用户选择。Shell脚本在第二次运行时使用第一次运行的参数

例子:

> . 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的实例,否则数据库将行不通。我有一种感觉,这可能是我的问题的来源,但我不知道如何解决它。

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

回答

0

我想出了一个办法来解决这个问题。我在脚本的末尾添加了set --,以便它取消所有参数。

为别人有同样的问题,set --清除所有的参数($ 1,$ 2,$ 3等)。使用shift仅删除第一个($ 1)或shift num以取消设置第一个num参数。因此,shift $#也将清除所有参数。

1

尝试:input=$arg,做一个unset arg,或报价if [["$#" -ne "1"]]

+0

好的建议,但这些都不适合我。但是,我只是意识到,只有在首先使用点调用我的脚本(> .chdb 2)时才会出现此问题。我一直在使用别名,所以忘了提及它。 我使用点,因为我在环境中设置变量,不想调用子shell实例,否则数据库设置将无法工作。我的问题是这个副作用吗?有没有办法解决这个问题? – dpatchery 2010-06-29 14:14:56

0

而且之后 - 你正在运行的代码“来源”,这意味着所有的脚本声明的环境不受变数仍然存在,当您再次运行。

尝试的

./chdb

代替

。 chdb

+0

在帖子中,“我使用了点,因为我在环境中设置变量,不想调用子shell实例,否则数据库设置将无法工作。我有一种感觉,这可能是我的来源问题,但我不知道如何解决它。“ – dpatchery 2010-06-30 12:15:49

1

如果您使用'。'脚本要设置环境变量,那么您在该脚本中声明的任何变量将自动成为全局变量,并传递到调用shell的会话中。

有隔离的变量,使他们非持久性三种途径:

1初始化变量

如果您使用的是单变量例如捕获用户选择DBSELECTION,无论是通过命令行还是以交互模式进入,您都可能希望通过将该变量初始化为空字符串来启动脚本;

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

- 在“interactiveMode”是你的定义获得用户的选择过程。当然,您的方法或函数名称可能会有所不同。

2.尚未设定的变量

如果您使用临时变量来注册用户选择 - 像上面的,DBSELECTION,你可能想在你的脚本的末尾取消设置变量;

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

3.定义局部而非全局变量

如果你使用的临时变量,它可能是更明智的本地定义它们(使用排版),而不是全球性,让他们做除了定义它们的功能之外没有持续存在。

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

这样KSH将处理变量的你,而不是你自己明确其解封。

相关问题