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