一个简单的问题,我可以在 sh
而不是 bash
zsh
或任何其他东西下使用数组吗?
ARRAYNAME=(value1 value2 .... valueN)
上面的命令只适用于 bash
。 sh
中是否有任何替代方案?
我试图搜索这样的问题,但没有找到纯 sh 的答案。
最佳答案
POSIX sh 在每个堆栈帧中只有一个“数组”,即当前作用域的参数列表。
您可以重置它:
set -- "first item" "second item"
...附加到它:
set -- "$@" "new item"
...从它的前面删除东西:
echo "First item is $1"
shift
echo "First item is $1"
...并通过跳转到一个新的功能范围来创建一个新的:
someFunc() {
echo "The argument list for this function is:" >&2
printf ' - %s\n' "$@"
}
someFunc argOne argTwo
...但是因为一次只有一个范围,所以非常有限。
如果它没有限制,ksh(以及后来的 bash 和其他)就没有理由添加任何其他形式的数组!
一个 hack 是滥用字符串,就好像它们是数组一样,当您需要对它们进行索引时,将它们拆分为函数参数:
s='A|B|C|D' # specify your "array" as a string with a sigil between elements
IFS='|' # specify separator between elements
set -f # disable glob expansion, so a * doesn't get replaced with a list of files
getNth() { shift "$(( $1 + 1 ))"; printf '%s\n' "$1"; }
getLast() { getNth "$(( $(length "$@") - 1 ))" "$@"; }
length() { echo "$#"; }
length $s # emits 4
getNth 0 $s # emits A
getNth 1 $s # emits B
getLast $s # emits D
当然,这意味着您需要保留值中不存在的印记字符。
作为与上述操作类似的第 3 方 shell 库(将“数组”编码为字符串,并在这些字符串中存储和检索内容),但具有转义/非转义支持,因此不需要印记,您可能还看看https://github.com/makefu/array/blob/master/array .也就是说,上面的代码为每次查找调用外部可执行文件——您将很快失去通过使用 POSIX sh 调用 sed
副本的额外运行时开销在 shell 启动时间上可能获得的任何 yield > 和 awk
用于每个操作。
关于linux - sh shell 下的数组(不是 bash),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53747156/