2016-10-26 95 views
0

由於某些原因,當使用「read -a」時,我的腳本僅將行的第一個元素放入數組中。例如,輸入一個字符串,如「加拿大中國」時,程序的輸出簡單地寫着:讀-a在Bash中沒有像預期的那樣工作

canada 
c 
Canada changed to uppercase. 

相反的:

canada China 
c 
Canada Changed to uppercase. 
C 
China Already uppercase. 

是我的任務的說明如下:

創建一個讀取用戶輸入並將其存儲在數組中的腳本。然後,在Array上循環:

  • 如果第一個字符是小寫字母,請將其更改爲大寫字母並將其寫入「更改爲大寫字母」。
  • 如果第一個字母已經是大寫字母,輸出輸入字,然後寫在它旁邊「已經大寫」。
  • 如果第一個字符不是字母,請輸出輸入字,然後在旁邊寫下「不以字母開頭」。 使用關聯數組做轉換從小寫爲大寫[converterArray =([A] = A [B] = B ...)]

這裏是我的代碼:

#!/bin/bash 

declare -A converterArray 
converterArray=([a]=A [b]=B [c]=C [d]=D [e]=E [f]=F [g]=G [h]=H [i]=I [j]=J [k]=K [l]=L [m]=M [n]=N [o]=O [p]=P [q]=Q [r]=R [s]=S [t]=T [u]=U [v]=V [w]=W [x]=X [y]=Y [z]=Z) 

read -p "Enter elements separated by space, return to end: " -a inputArray 

lowercasemsg=" Changed to uppercase." 
uppercasemsg=" Already uppercase." 
notlettermsg=" Doesn't start with a letter." 

echo $inputArray 

for word in $inputArray; do 
    firstchar=${word:0:1} 
    echo $firstchar 

    case $firstchar in 
    [a-z]*) 
     word = ${converterArray[$firstchar]}${word:1} 
     echo $word$lowercasemsg 
     ;; 
    [A-Z]*) 
     echo $word$uppercasemsg 
     ;; 
    *) 
     echo $word$notlettermsg 
     ;; 
    esac 

done 

EDIT :感謝John的幫助,問題已解決。我還修復了檢查字母([a-z]和[[:lower:]])大小寫的問題,並刪除了用於調試的不必要的「回聲」。

#!/bin/bash 

declare -A converterArray 
converterArray=([a]=A [b]=B [c]=C [d]=D [e]=E [f]=F [g]=G [h]=H [i]=I [j]=J [k]=K [l]=L [m]=M [n]=N [o]=O [p]=P [q]=Q [r]=R [s]=S [t]=T [u]=U [v]=V [w]=W [x]=X [y]=Y [z]=Z) 

read -p "Enter elements separated by space, return to end: " -a inputArray 

lowercasemsg=" Changed to uppercase." 
uppercasemsg=" Already uppercase." 
notlettermsg=" Doesn't start with a letter." 

for word in "${inputArray[@]}"; do 
    firstchar=${word:0:1} 

    case $firstchar in 
    [[:lower:]]*) 
     inputString=${converterArray[$firstchar]}${word:1} 
     echo $word$lowercasemsg 
     ;; 
    [[:upper:]]*) 
     echo $word$uppercasemsg 
     ;; 
    *) 
     echo $word$notlettermsg 
     ;; 
    esac 

done 

(第2編輯:固定電話,我忘了把空間圍繞等號,原本被遺忘在以前的編輯)

+0

由於'case'使用shell模式,你不需要明確的提取物中的第一個字符:'案 「$詞」 在[[:降低:] *)...' –

+0

此外,閱讀[忘記在bash/POSIX shell中引用一個變量的安全含義](http://unix.stackexchange.com/q/171346/4667) –

+0

並且使用大寫的第一個字母:'var = hello; echo「$ var - > $ {var ^} - > $ {var ^^}」' –

回答

2

如果$array是一個數組,"${array[@]}"給所有的數組元素。裸體$array僅引用第一個元素。

echo "${inputArray[@]}" 

for word in "${inputArray[@]}"; do 
    ... 
done 
+0

謝謝!作爲後續,你會想要使用$ array的情況是什麼?另外,「$ {array [@]}」引號的原因是什麼?腳本似乎也沒有它們。 –

+0

引號確保具有空白的數組元素正確處理。例如,'inputArray =('el salvador''costa rica')'。嘗試使用和不使用雙引號的for循環。 –

+0

我永遠不會對數組使用'$ array'。這隻適用於常規變量。 –

相關問題