我有 unix shell 脚本,需要像下面这样运行
test_sh XYZ=KLMN
脚本的内容是
#!/bin/ksh
echo $XYZ
set -k
在运行脚本之前使用 XYZ 的值。
在运行脚本之前,有没有一种方法可以在没有 doint set -k 的情况下做到这一点。或者有什么我可以在脚本中做的事情,我可以在以下方式运行脚本时使用给定参数的值
test_sh XYZ=KLMN
我正在使用 ksh。任何帮助表示赞赏。
运行这个怎么样?
XYZ=KLMN ./test_sh //running from directory where test_sh is
如果您的脚本不需要其他参数,那么快速而肮脏的方法是将
eval "$@"
在脚本的开头。这会将命令行参数评估为 shell 命令。如果这些命令要分配一个外壳/环境变量,那么它就是这样做的。
它既快又脏,因为任何东西都可以放在命令行上,从而导致从语法错误到严重的安全漏洞(如果脚本是受信任的)的问题。
我不确定 "$@" 在 ksh 中的含义是否与在 bash 中的含义相同 - 仅使用 $* (不带引号)也可以,但更脏。
看起来您正在尝试在脚本中使用环境变量“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
请注意,作业中的间距很重要——不要使用空格。
我正在尝试这个选项
#!/bin/ksh
echo $1
awk '{FS="=";print $2}' $1
并在命令行上
test_sh INSTANCE=LSN_MUM
但是 awk 失败了。这里有什么问题吗?
可能#!/bin/ksh -k
会工作(未经测试)。