【问题标题】:Problem in running a script运行脚本的问题
【发布时间】:2009-10-15 11:14:13
【问题描述】:

我有 unix shell 脚本,需要像下面这样运行

test_sh XYZ=KLMN

脚本的内容是

#!/bin/ksh

echo $XYZ

为了使用 XYZ 的值,我在运行脚本之前已经做了set -k

有没有一种方法可以让我在运行脚本之前不使用 doint set -k 来做到这一点。或者有什么我可以在脚本中做的事情,我可以在以下方式运行脚本时使用给定参数的值

test_sh XYZ=KLMN

我正在使用 ksh。 任何帮助表示赞赏。

【问题讨论】:

标签: bash unix shell ksh


【解决方案1】:

运行这个怎么样?

XYZ=KLMN ./test_sh //running from directory where test_sh is

【讨论】:

  • 使用外部 /usr/bin/env 的同义词,它是 shell 中立的:env XYZ=KLMN ./test.sh
  • 限制是我必须以这种方式运行脚本只有 test_sh XYZ=KLMN
【解决方案2】:

如果您的脚本不需要其他参数,那么一种快速而肮脏的方法就是放置

eval "$@"

在脚本的开头。这会将命令行参数评估为 shell 命令。如果这些命令要分配一个 shell/环境变量,那么它就是这样做的。

它既快又脏,因为任何东西都可以放在命令行上,从而导致从语法错误到严重的安全漏洞(如果脚本是受信任的)的问题。

我不确定“$@”在 ksh 中的含义是否与在 bash 中的含义相同 - 仅使用 $*(不带引号)也可以,但更脏。

【讨论】:

    【解决方案3】:

    您似乎正在尝试在脚本中使用环境变量“INSTANCE”。

    为此,必须在执行脚本之前设置环境变量。使用“set”命令设置可导出的环境变量。顺便说一句,我的 ksh 版本可以追溯到 1993 年,当时“-k”选项已经过时了。

    要设置环境变量以便将其导出到生成的 shell 中,只需使用“导出”命令,如下所示:

    export INSTANCE='whatever you want to put here'
    

    如果您想为脚本使用位置参数——即在脚本中访问“KLMN”值,并假设它是第一个参数,那么您在脚本中执行以下操作:

    #!/bin/ksh
    
    echo $1
    

    您还可以将位置参数分配给局部变量,以便以后在脚本中使用,如下所示:

    #!/bin/ksh
    
    param_one=$1
    echo $param_one
    

    你可以这样调用:

    test_sh KLMN
    

    请注意,分配中的间距很重要——不要使用空格。

    【讨论】:

      【解决方案4】:

      我正在尝试这个选项

      #!/bin/ksh
      
      echo $1
      awk '{FS="=";print $2}' $1
      

      在命令行上

      test_sh INSTANCE=LSN_MUM
      

      但是 awk 失败了。这里有什么问题吗?

      【讨论】:

      • $1 视为文件名。您应该通过管道将其回显到 awk。
      【解决方案5】:

      #!/bin/ksh -k 可能会起作用(未经测试)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-26
        • 2013-03-11
        • 1970-01-01
        • 1970-01-01
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多