执行包含特殊字符的字符串

时间:2019-08-02 06:21:36

标签: linux ksh

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,

仍在学习的史蒂夫

1 个答案:

答案 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}"

成功了。感谢所有答复!

仍在学习的史蒂夫