不同ksh环境下的赋值变量

时间:2014-04-04 11:50:53

标签: linux shell unix ksh aix

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

我尝试为可以在3环境中工作的变量赋值,尤其是wc -lsed/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 HostLinuxHostSunHostAix设置为true / false,具体取决于运行环境(只有1是你想象的那样)

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

我尝试在每个分配行上避免eval(有超过1500行,想象代码和注释以及调试的乐趣)


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

="$( some code without escape specific)谎言用于='some code'(&#39;用于反向引用)

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

->

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

具体不承认代码仍然需要&#34;评估&#34;通过字符串

1 个答案:

答案 0 :(得分:2)

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

{k}的所有版本的set -A语法都可以分配值。如果在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 a 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/")"