0

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

test_sh XYZ=KLMN

脚本的内容是

#!/bin/ksh

echo $XYZ

set -k在运行脚本之前使用 XYZ 的值。

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

test_sh XYZ=KLMN

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

4

5 回答 5

4

运行这个怎么样?

XYZ=KLMN ./test_sh //running from directory where test_sh is
于 2009-10-15T11:38:10.383 回答
3

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

eval "$@"

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

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

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

于 2009-10-15T12:01:13.347 回答
0

看起来您正在尝试在脚本中使用环境变量“INSTANCE”。

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

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

export INSTANCE='whatever you want to put here'

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

#!/bin/ksh

echo $1

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

#!/bin/ksh

param_one=$1
echo $param_one

您可以使用以下方法调用它:

test_sh KLMN

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

于 2009-10-15T11:35:53.430 回答
0

我正在尝试这个选项

#!/bin/ksh

echo $1
awk '{FS="=";print $2}' $1

并在命令行上

test_sh INSTANCE=LSN_MUM

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

于 2009-10-15T12:36:10.187 回答
0

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

于 2009-10-15T17:49:06.407 回答