一个简单的问题,我能在只使用sh
,而不是bash
、zsh
或其他任何东西的情况下使用数组吗?
ARRAYNAME=(value1 value2 .... valueN)
上面的命令只在bash
中有效。有没有在sh
中的替代方法?
我尝试搜索这样的问题,但没有找到适用于纯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
sed
和awk
的副本,您很快就会失去在shell启动时间上获得的任何优势。
set -- new "$@"
- glenn jackmanBASH_ARGC
和BASH_ARGV
的定义;同样,FUNCNAME
的定义)。即使在POSIX sh中,对于参数列表,栈也是明显的实现方式,也是用于描述行为的简单习惯用法。 - Charles Duffyeval.c
文件的evalfun
函数中使用C栈来存储参数列表的旧值,当跳入一个函数时--但实际上它仍然是一个堆栈。 - Charles Duffy