gpt4 book ai didi

linux - 不同ksh环境下的赋值变量

转载 作者:太空宇宙 更新时间:2023-11-04 09:39:36 24 4
gpt4 key购买 nike

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

我尝试将值分配给将在 3 环境中工作的变量,尤其是像 wc -l 这样的操作的结果或 sed/awk , ...

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

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

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 HostLinux , HostSunHostAix根据运行环境设置为 true/false(正如你想象的那样,只有 1 个是 true)

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='"'

具体无法识别的代码还需要通过字符串“求值”

最佳答案

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

set -A 语法为 ksh 的所有版本都有效。如果您在 bash 下运行脚本,则只需要使用替代的 typeset -a 语法。最简单的解决方案是始终在 ksh 下运行您的代码。您所有的平台都有 ksh93,所以只需使用它:在 Linux 上,安装 ksh 包并使用它代替 bash。在ksh93下,也可以使用a=(aModeTrace false false false false);这在 bash 中也有效,但在 ksh88 中无效(AIX 的 ksh 是 ksh88,但还有一个ksh93`)。

如果您绝对需要一个可在 ksh88 和 bash 之间移植的脚本,您可以将 eval hackery 放在函数中。只有整个数组赋值需要用这种方式包装,访问单个元素、数组大小和单个元素赋值的语法是相同的。使用 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/")"

关于linux - 不同ksh环境下的赋值变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22862038/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com