【问题标题】:executing a string containing special characters执行包含特殊字符的字符串
【发布时间】:2019-08-02 06:21:36
【问题描述】:

RH6 ksh93

我无法让 kornshell 脚本执行命令。以下两个变量在两个命令之间是常量

GLOBAL_CAT=/a/path/to/a/dir
DATA=/a/data/file.txt

命令 1: m_cat_add -catalog $GLOBAL_CAT -data $DATA -key '{aKey1}'

命令 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,

还在学习的史蒂夫

【问题讨论】:

  • 您能否包含m_cat -catalog ${GLOBAL_CAT} -data ${DATA} -key '${KEYY}' 输出?运行`eval "$CMDSTR"` 意味着您再次将eval "$CMDSTR" 输出作为命令执行。

标签: linux ksh


【解决方案1】:

原来分号是默认的 IFS 字符之一,隐式解析发生在变量扩展期间。所以与

KEYY="{aKey1; aKey2}"

CMDSTR 变为

m_cat -catlog foobar -data bohica '{aKey

由于不匹配的单引号,它不能是有效的命令。解决方案是将 IFS 设置为我知道不会出现在字符串中的字符

IFS='<'

成功了。感谢所有回复!

还在学习的史蒂夫

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多