【问题标题】:assignation variable under different ksh environment不同ksh环境下的赋值变量
【发布时间】:2014-05-16 17:20:02
【问题描述】:

我有一个脚本需要在(主要)3 环境(AIX、Linux [Red hat]、sun [由于迁移几乎不再存在])下运行,但始终在 ksh(不是 ksh93)下运行

我尝试将值分配给可在 3 环境中工作的变量,尤其是像 wc -lsed/awk 之类的操作,...

由于规范和外壳解释,我找不到通用代码。我可以使用if 命令来使用基于操作系统的特定版本的分配代码,但代码需要被每个shell 理解

带有数组声明的问题示例(和评估解决方案)

if ${HostLinux}
 then
   eval 'typeset -a aModeTrace=( [0]=false [1]=false [2]=false [3]=false )'
 else
   eval 'set -A aModeTrace false false false false'
 fi

现在我有一个要 sed 并分配给变量的字符串 aix 代码使用

ThisLine="have a \" and a ' or maybe a \\; and many more other char like any log file could have"
cst_PrintfPipeOS="
"
SampleSize=24
printf '%s%s' "${ThisLine}" "${cst_PrintfPipeOS}" | sed -e "s/^\(.\{${SampleSize}\}\).*/\1/" | read Result

为简单起见,我可以使用 3 var HostLinuxHostSunHostAix 设置为真/假,具体取决于运行环境(您可以想象,只有 1 个为真)

1) 如何处理等价的|在 linux 中读取代码不会在 AIX/SUN 上挂起的代码(类似 read Result <<< 的代码在 AIX 上挂起) 2)使用 Result="some code" 取决于 "' 内容和变量周围的报价

我尽量避免在每一行赋值eval(有超过 1500 行,想象一下代码和注释以及调试的乐趣)


使用的解决方案(感谢@Gilles)

使用="$( some code without escape specific) 谎言作为='some code'(' 用于反引号)

Result1="`echo '\"'`"
Result2="$(echo '"')"
echo '+Grep'
set | egrep "[R]esult"

->

Result1="
Result2="
+Grep
Result1='"'
Result2='"'

具体不识别代码仍需通过字符串“评估”

【问题讨论】:

    标签: linux shell unix ksh aix


    【解决方案1】:

    简答:在所有平台上使用ksh93

    set -A 语法用于为所有版本的 ksh 中的作品赋值。如果您在 bash 下运行脚本,则只需使用备用 typeset -a 语法。最简单的解决方案是始终在 ksh 下运行您的代码。您所有的平台都有 ksh93,所以只需使用它:在 Linux 上,安装 ksh 包并使用它而不是 bash。 ksh93下也可以使用a=(aModeTrace false false false false);这也适用于 bash,但不适用于 ksh88(AIX 的 ksh is ksh88 but there is also aksh93`)。

    如果您绝对需要在 ksh88 和 bash 之间移植的脚本,您可以将 evalhackery 放入函数中。只有整个数组赋值需要以这种方式包装,访问单个元素、数组大小和单个元素赋值的语法是相同的。使用 shell 而不是操作系统来选择实现。

    ## set_array ARRAY ELEMENT0 ELEMENT1 …
    ## Set the variable ARRAY to contain the specified elements. Like
    ## ARRAY=(ELEMENT0 ELEMENT1 …), but also supply a method that works in ksh88.
    if [[ -n $BASH_VERSION ]]; then eval '
      set_array () { eval "shift; $1=(\"\$@\")"; }'
    else eval '
      set_array () { typeset __set_array_var=$1; shift
        set -A $__set_array_var -- "$@"
      }'
    fi
    

    (请注意,在 ksh 中,set -A "$@" 几乎可以正常工作,但并不完全正常:如果数组的第一个元素以破折号开头,则会失败。)

    字符串分配和引用在所有 shell 中都以相同的方式工作,不存在可移植性问题。

    要分配命令的输出,请使用命令替换(同样,它是可移植的)。更改输出的唯一方法是删除尾随换行符(不像 read 扩展反斜杠并修剪前导和尾随空格)。

    Result="$(printf '%s%s' "${ThisLine}" "${cst_PrintfPipeOS}" | 
      sed -e "s/^\(.\{${SampleSize}\}\).*/\1/")"
    

    【讨论】:

    • 应该不错,但我不可能在每个系统上都有 ksh93,有些有但不是全部,如果我也测试这个选项,同样的问题也可能发生其他意外行为。
    • +1 表示“$( ...)”,它似乎适用于包含单引号的变量,其中 `` 失败(在我的 AIX 测试中)。还有一些测试来验证你的答案。谢谢
    • @NeronLeVelu $(…) 在所有现代 shell(bash、ksh、dash 等)中都能无缝工作,只是在一些旧的 Bourne shell 中,您需要使用古怪的反引号语法。我强烈建议在任何地方安装 ksh93(它 is 在任何地方都可用),但是如果您绝对需要在 ksh88 和 bash 中都可以使用的脚本,我已经编辑了我的答案以展示如何处理不同的语法数组赋值。
    猜你喜欢
    • 1970-01-01
    • 2017-09-23
    • 2020-04-04
    • 2021-03-23
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    相关资源
    最近更新 更多