2013-06-21 6 views

ответ

7

Вы можете конвертировать весь массив я не пе выстрел:

WHITELIST=("${WHITELIST[@],,}") 
printf "%s\n" "${WHITELIST[@]}" 
this 
example 
somthing 
2

Вы можете использовать ${parameter,,}:

WHITELIST=(
     "THIS" 
     "examPle" 
     "somTHing" 
     ) 

i=0 
for elt in "${WHITELIST[@]}" 
do 
    NEWLIST[$i]=${elt,,} 
    i=$((${i} + 1)) 
done 

for elt in "${NEWLIST[@]}" 
do 
    echo $elt 
done 

Из страницы руководства:

${parameter,,pattern} 
      Case modification. This expansion modifies the case of alpha‐ 
      betic characters in parameter. The pattern is expanded to pro‐ 
      duce a pattern just as in pathname expansion. The^operator 
      converts lowercase letters matching pattern to uppercase; the , 
      operator converts matching uppercase letters to lowercase. The 
      ^^ and ,, expansions convert each matched character in the 
      expanded value; the^and , expansions match and convert only 
      the first character in the expanded value. If pattern is omit‐ 
      ted, it is treated like a ?, which matches every character. If 
      parameter is @ or *, the case modification operation is applied 
      to each positional parameter in turn, and the expansion is the 
      resultant list. If parameter is an array variable subscripted 
      with @ or *, the case modification operation is applied to each 
      member of the array in turn, and the expansion is the resultant 
      list. 
+0

Хорошее решение, но это 'только Баш 4.x'. –

+1

* shrug * и? :) 'tr' (ваш ответ) - отличный откат. –

+1

Не поймите меня неправильно, я просто подумал, что было бы хорошо сообщить OP об этом, чтобы предотвратить ненужную душевную боль неспособность выполнить действительно хорошее решение. :) –

0

Один из способов сделать это:

$ WHITELIST=("THIS" "examPle" "somTHing") 
$ x=0;while [ ${x} -lt ${#WHITELIST[*]} ] 
    do WHITELIST[$x]=$(tr [A-Z] [a-z] <<< ${WHITELIST[$x]}) 
    let x++ 
done 
$ echo "${WHITELIST[@]}" 
this example somthing 
+1

Безрезервное разнообразие может изменять количество элементов в 'WHITELIST', при условии разбиения слов. – chepner

+0

@chepner Вы правы! Если вы не возражаете, не могли бы вы объяснить, почему это произошло? –

+1

'tr' считывает ввод как одну строку текста, теряя представление о том, где остановлен один элемент и начинается следующее. Результатом также является одна строка текста, оболочка которой разбивается на слова на основе текущего значения 'IFS' для установки нового значения' WHITELIST'. Короче говоря, 'tr' не знает о массивах и поэтому не может сохранить различие между элементами. – chepner