如何在POSIX中标记数组?

Cha*_*les 14 arrays bash posix sh

在替换shell脚本中的外部命令时,我使用了一个数组来摆脱awk NF.

现在,由于我从bash转移到POSIX sh,我无法将数组标记为正确:

#!/bin/bash
export RANGE="0 1 4 6 8 16 24 46 53"
RANGE=($RANGE)
echo arrayelements: $((${#RANGE[@]}))
LAST=$((${#RANGE[@]}-1))
echo "Last element(replace NF): ${RANGE[$LAST]}"

# ./foo
arrayelements: 9
Last element(replace NF): 53
Run Code Online (Sandbox Code Playgroud)

我正在使用OpenBSD,sh和它的大小与ksh完全相同.更改为以上/bin/sh,似乎以下不起作用:

set -A "$RANGE"
set -- "$RANGE"
Run Code Online (Sandbox Code Playgroud)

我怎么能实现上面的脚本/bin/sh?(注意,如果你调用bash,它可以正常工作--posix,那不是我想要的.)

Mat*_*ery 23

数组不是POSIX sh规范的一部分.

还有其他各种方法可以找到最后一项.几种可能性:

#!/bin/sh
export RANGE="0 1 4 6 8 16 24 46 53"
for LAST_ITEM in $RANGE; do true; done
echo "Last element(replace NF): $LAST_ITEM"
Run Code Online (Sandbox Code Playgroud)

要么:

#!/bin/sh
export RANGE="0 1 4 6 8 16 24 46 53"
LAST_ITEM="${RANGE##* }"
echo "Last element(replace NF): $LAST_ITEM"
Run Code Online (Sandbox Code Playgroud)

  • @ AlikElzin-kilaka,如果现有标准在过去5年(现在7年)中发生变化,那就不会特别"标准化",不是吗? (3认同)

Sam*_* S. 5

您可以使用 Github 中的以下项目,该项目实现了符合 POSIX 标准的数组,该数组适用于我尝试过的所有 shell:https : //github.com/makefu/array

使用起来不是很方便,但我发现它很适合我的目的。

  • 对于那些想知道的人来说,这是一个 WTFPL 许可的 PoC 脚本,它将数组元素存储在字符串中,并用换行符分隔。为了还允许换行,在将元素放入字符串之前对元素进行编码(换行符由 %0A 替换,百分号由 %25 替换),并在检索时对其进行解码。 (2认同)