linux - sh shell 下的数组(不是 bash)

标签 linux shell

一个简单的问题,我可以在 sh 而不是 bash zsh 或任何其他东西下使用数组吗?

ARRAYNAME=(value1 value2 .... valueN)
上面的命令只适用于 bashsh 中是否有任何替代方案
我试图搜索这样的问题,但没有找到纯 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/

相关文章:

bash - 处理shell脚本输入中特殊字符的简单解决方案

linux - 转换列模式

linux - 退出嵌套 shell 后 ssh 脚本命令丢失

c++ - 如何从 shell 传递整数 vector ?

c - 使用 Gstreamer 播放蓝牙音频流

linux - 尽管在 sudoers 中拥有完全权限,但没有文件权限

c - System V 消息队列 - 获取已存在的消息

linux - Mandriva Linux 中的 Redmine——设置电子邮件通知

python - 从 bash : Command not found error 运行 Python 脚本

linux - 从多个子目录中删除文件,但在每个子目录中保留 3 个最新文件