RH6 ksh93
我在获取kornshell脚本来执行命令时遇到麻烦。以下两个变量在两个命令之间是恒定的
GLOBAL_CAT=/a/path/to/a/dir
DATA=/a/data/file.txt
cmd 1: m_cat_add -catalog $ GLOBAL_CAT -data $ DATA -key'{aKey1}'
cmd 2: m_cat_add -catalog $ GLOBAL_CAT -data $ DATA -key'{aKey1; aKey2}'
密切注意括号内的单引号和分隔两个键值的分号
cmd1和cmd2都很好用通过键盘交互输入时 m_cat命令要求-key的值用单引号引起来
现在,我整理了一个方便的kornshell脚本:
GLOBAL_CAT=/a/path/to/a/dir
DATA=/a/data/file.txt
KEYY="{aKey1}"
CMDSTR="m_cat -catalog ${GLOBAL_CAT} -data ${DATA} -key '${KEYY}'"
`eval "$CMDSTR"` # works
KEYY="{aKey1; aKey2}"
CMDSTR="m_cat -catalog ${GLOBAL_CAT} -data ${DATA} -key '${KEYY}'"
`eval "$CMDSTR"` # m_cat throws a "usage" errmsg
因此,存在该分号时发生了一些细微而棘手的事情,好像ksh在扩展vars之后,忽略了单引号并假定分号标志了命令的结尾,这对于m_cat命令。
在现实世界中,我的脚本在while循环中从文件中读取了三个变量,所以我不能只手动编辑KEYY
有什么想法吗?反斜线?以某种方式强迫字面意思?
TIA,
仍在学习的史蒂夫
答案 0 :(得分:0)
原来,分号是默认的IFS字符之一,在变量扩展过程中会进行隐式解析。因此,
FlowLayoutPanel
CMDSTR变为
Private Sub saveIntoList(flp As FlowLayoutPanel)
clsHelper.list = New List(Of String)
_saveIntoList(flp)
End Sub
Private Sub _saveIntoList(control As Control)
If TypeOf control Is TextBox Then
clsHelper.list.Add(DirectCast(control, TextBox).Text)
Return
End If
For Each child As Control In control.Controls
_saveIntoList(child)
Next
End Sub
,由于单引号不匹配,该命令无效。解决方案是将IFS设置为我知道永远不会出现在字符串中的字符
KEYY="{aKey1; aKey2}"
成功了。感谢所有答复!
仍在学习的史蒂夫