2011-06-27 11 views
8

बाहरी कमांड को शेल स्क्रिप्ट में बदलते समय, मैंने अर्क के NF से छुटकारा पाने के लिए एक सरणी का उपयोग किया।POSIX sh में किसी सरणी को कैसे चिह्नित करें?

अब, के बाद से मैं POSIX श को पार्टी से चले गए, मैं नहीं मिल सकता है सरणी सही चिह्नित:

#!/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 के, श उपयोग कर रहा हूँ और यह ksh के रूप में बिल्कुल एक ही आकार की है। /bin/sh के लिए ऊपर बदलने, ऐसा लगता है कि निम्नलिखित काम नहीं करता:

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

मैं /bin/sh में ऊपर स्क्रिप्ट कैसे एहसास कर सकता है? (ध्यान दें कि अगर आप --posix के साथ बैश का आह्वान करते हैं तो यह ठीक काम करता है, जो मैं देखता हूं।)

+1

इसके अलावा: ऑल-कैप्स परिवर्तनीय नाम खराब रूप हैं। Http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html, चौथे पैराग्राफ में पर्यावरण परिवर्तनीय नामों के लिए सम्मेलनों को देखें, ध्यान रखें कि पर्यावरण चर और शैल वेरिएबल नामस्थान साझा करते हैं - इसलिए निम्न-केस नामों का उपयोग करना आपके स्थानीय चर के लिए सिस्टम को अर्थ के साथ गलती से कुछ लिखना बंद कर देगा। –

उत्तर

12

Arrays 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

यह केवल उन तत्वों के लिए काम करता है जिनमें स्वयं को व्हाइटस्पेस नहीं है। आपके खोल में एक सरणी रखने का बिंदु ऐसे तत्वों को अनुमति देना है। – chepner

2

आप Github, जो एक POSIX अनुरूप सरणी को लागू करता है, जो सभी के गोले मैंने कोशिश में काम करता है से निम्नलिखित परियोजना का उपयोग कर सकते हैं: https://github.com/makefu/array

यह बहुत उपयोग करने के लिए सुविधाजनक नहीं है, लेकिन मैं इसे अच्छी तरह से करने के लिए काम करने के लिए मिला मेरे उद्देश्य