2013-05-29 6 views
6

मेरे पास वैध वर्णों का एक सेट है [0-9a-z_] और एक चर जो इन वर्णों में से एक असाइन किया गया है। मैं जो करना चाहता हूं वह उस चर को सेट में अगले में बढ़ाने में सक्षम होना है।बैश - वृद्धिशील चर जिसमें अक्षरों

यदि आवश्यकता हो तो मैं "विशेष" मामलों को संभाल सकता हूं जहां यह '9' से 'ए' और 'z' से '_' तक बढ़ेगा, लेकिन मैं यह नहीं समझ सकता कि अक्षरों को कैसे बढ़ाया जाए।

#!/bin/bash 
y=b 
echo $y # this shows 'b' 
y=$((y+1)) 
echo $y # this shows '1', but I want it to be 'c' 
+0

आप इस के लिए देख रहे हैं? http://stackoverflow.com/a/13128083/297323 –

उत्तर

6
y=b 
echo "$y" # this shows 'b' 
y=$(echo "$y" | tr "0-9a-z" "1-9a-z_") 
echo "$y" # this shows 'c' 

ध्यान दें कि यह उस मामले को संभाल नहीं करता है जहां $ y = "_" (सुनिश्चित नहीं है कि आप क्या चाहते हैं, और किसी भी मामले में इसे शायद अलग हैंडलिंग की आवश्यकता होगी), और यदि $ y एक से अधिक वर्ण लंबे समय तक होगा उनमें से सभी "वृद्धि" (यानी "10" -> "21", "09 जी" -> "1ah", आदि)।

+0

यही वह है जिसे मैं ढूंढ रहा था। मैं उन विशेष मामलों को संभाल सकता हूं जहां $ y अधिक एक वर्ण लंबा होता है या जब यह "_" के बराबर होता है। यह एक बहुत अच्छा समाधान है तो बदसूरत सरणी मैं इस्तेमाल किया। धन्यवाद! –

+0

'वाई = बी; y = $ (tr "0-9a0-z" "1-9a-z_" <<< $ y); echo $ y; ' – dylnmc

3

हो सकता है कि यह एक समाधान हो सकता है:

a=({0..9} {a..z} _) 
echo ${a[*]} 
yc=11 
echo ${a[yc]} 
((++yc)) 
echo ${a[yc]} 
echo ${a[++yc]} 

#Alternative 
declare -A h 
# Fill the has point to the next character 
for((i=0;((i+1))<${#a[*]};++i)) { h[${a[i]}]=${a[i+1]};} 
y=b 
echo $y, ${h[$y]} 

आउटपुट:

0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z _ 
b 
c 
d 
b, c 
+1

यह काम करता है, और वास्तव में जो मैंने बनाया है उसके करीब है, लेकिन यह सबसे सुंदर समाधान नहीं है। एक बेहतर तरीका होना चाहिए ... –

+0

वास्तव में यह आपके द्वारा स्वीकार किए गए विचारों में बिल्कुल वही उपयोग करता है, लेकिन यह कम संसाधनों का उपयोग करता है। कम से कम दो कांटे कम और अन्य बाहरी कार्यक्रमों के लिए कोई निष्पादन नहीं। – TrueY

1

आप इस के साथ शुरू कर सकते हैं:

echo 0x$(($(printf "%x" "'b'") + 1)) | xxd -r 
-1

मैंने इसे एक परियोजना के लिए लिखा है, यह chr और ord fucntions (यहां कहीं भी पाया जाता है) का उपयोग करता है और कुछ शुद्ध बैश (फ़ंक्शन में केवल बाहरी कहा जाता है), यदि आप 100 से अधिक वर्णों का उपयोग कर रहे हैं कुछ और, लेकिन मेरे परीक्षण में छोटे तारों के लिए यह वास्तव में अजगर की तुलना में थोड़ा तेज है। यह स्क्रिप्ट किसी भी इनपुट को कम करता है, आपको ऊपरी मामले के लिए इसे संशोधित करना होगा। अपनी स्क्रिप्ट में इन कार्यों डाल (या कट जाता है और एक खोल में पेस्ट करें) के बाद आप सिर्फ

कर abz9z9

inc_string कर सकते हैं और वापस मिलता है।

aca0a0

chr() { 
    [ "$1" -lt 256 ] || return 1 
    printf "\\$(printf '%03o' "$1")" 
} 

ord() { 
    LC_CTYPE=C printf '%d' "'$1" 
} 

inc_string() 
{ 
string="$1"; 
lcstring=$(echo $string | tr '[:upper:]' '[:lower:]'); 


for ((position=$((${#lcstring}-1));position>=0;position--));do 

    if [ "${lcstring:position:1}" = 'z' ]; then 
    if [ "$position" -eq "$((${#lcstring}-1))" ]; then 
     newstring="${lcstring:0:$(($position))}a"; 
     lcstring="$newstring"; 
    elif [ "$position" -eq "0" ]; then 
     newstring="a${lcstring:$((position+1))}"; 
     echo $newstring; 
     break; 
    else 
     newstring="${lcstring:0:$(($position))}a${lcstring:$((position+1))}"; 
     lcstring="$newstring"; 
    fi 
    elif [ "${lcstring:position:1}" = '9' ]; then 
    if [ "$position" -eq "$((${#lcstring}-1))" ]; then 
     newstring="${lcstring:0:$(($position))}0"; 
     lcstring="$newstring"; 
    elif [ "$position" -eq "0" ]; then 
     newstring="0${lcstring:$((position+1))}"; 
     echo $newstring; 
     break; 
    else 
     newstring="${lcstring:0:$(($position))}0${lcstring:$((position+1))}"; 
     lcstring="$newstring"; 
    fi 
    else 
    if [ "$position" -eq "$((${#lcstring}-1))" ]; then 
     newstring="${lcstring:0:$(($position))}$(chr $(($(ord ${lcstring:position})+1)))"; 
     echo $newstring; 
     break; 
    elif [ "$position" -eq "0" ]; then 
     newstring="$(chr $(($(ord ${lcstring:position})+1)))${lcstring:$((position+1))}"; 
     echo $newstring; 
     break; 
    else 
     newstring="${lcstring:0:$(($position))}$(chr $(($(ord ${lcstring:position})+1)))${lcstring:$(($position+1))}"; 
     echo $newstring; 
     break;    
    fi 
    fi 
done 

} 
संबंधित मुद्दे