2011-06-27 23 views
8

在shell腳本中替換外部命令時,我使用了一個數組來擺脫awk的NF。現在如何在POSIX sh中標記數組?

,因爲我從慶典到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 
我使用OpenBSD的,SH

而且具有完全相同的大小與KSH相同。 以上/bin/sh改變,似乎以下不工作:

set -A "$RANGE" 
set -- "$RANGE" 

我怎麼能實現/bin/sh上面的腳本? (請注意,如果你用--posix調用bash,那麼它工作正常,這不是我所期望的。)

+1

另外:所有大寫變量名稱都是錯誤的形式。請參閱http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html第四段中有關環境變量名稱的約定,請記住環境變量和shell變量共享一個名稱空間 - 所以使用小寫名稱因爲你的局部變量將防止意外地覆蓋系統的含義。 –

回答

12

數組不是POSIX sh specification的一部分。

有很多其他方法可以找到最後一個項目。一對夫婦的可能性:

#!/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" 

或:

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

5年過去了。任何更新? –

1

下面的代碼對我的作品使用Heirloom Bourne Shell

#!/usr/local/bin/bournesh 
# cf. Heirloom Bourne Shell, 
#  http://freshmeat.net/projects/bournesh/ 
#  http://www.in-ulm.de/~mascheck/bourne/ 

# use a caret as a pipe symbol to make sure it's a Bourne shell 
# cf. http://mywiki.wooledge.org/BourneShell 
ls^cat 1>/dev/null 2>&1 || 
    { echo 'No true Bourne shell! ... exiting ...'; exit 1; } 

IFS=' ' 
unset RANGE 
RANGE="0 1 4 6 8 16 24 46 53" 
export IFS RANGE 
set -- $RANGE 
echo arrayelements: $# 
LAST=$# 
eval echo "Last element\(replace NF\): \$$#" 

注意IFS被設置爲一個空間,有沒有雙引號約爲$RANGE

+2

這隻適用於本身不包含空格的元素。在你的shell中有一個數組的目的是允許這樣的元素。 – chepner

2

您可以使用從GitHub,它實現了一個符合POSIX標準的陣列,這在我嘗試了所有炮彈工作的以下項目:https://github.com/makefu/array

這不是使用非常方便,但我發現它的好工作我的目的。