У меня есть массив в bash.Как преобразовать все элементы массива bash в нижний регистр?
WHITELIST=(
"THIS"
"examPle"
"somTHing"
)
Как преобразовать все элементы в строчные буквы в существующем или в новом массиве?
У меня есть массив в bash.Как преобразовать все элементы массива bash в нижний регистр?
WHITELIST=(
"THIS"
"examPle"
"somTHing"
)
Как преобразовать все элементы в строчные буквы в существующем или в новом массиве?
Вы можете конвертировать весь массив я не пе выстрел:
WHITELIST=("${WHITELIST[@],,}")
printf "%s\n" "${WHITELIST[@]}"
this
example
somthing
Вы можете использовать ${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.
Один из способов сделать это:
$ 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
Безрезервное разнообразие может изменять количество элементов в 'WHITELIST', при условии разбиения слов. – chepner
@chepner Вы правы! Если вы не возражаете, не могли бы вы объяснить, почему это произошло? –
'tr' считывает ввод как одну строку текста, теряя представление о том, где остановлен один элемент и начинается следующее. Результатом также является одна строка текста, оболочка которой разбивается на слова на основе текущего значения 'IFS' для установки нового значения' WHITELIST'. Короче говоря, 'tr' не знает о массивах и поэтому не может сохранить различие между элементами. – chepner
Хорошее решение, но это 'только Баш 4.x'. –
* shrug * и? :) 'tr' (ваш ответ) - отличный откат. –
Не поймите меня неправильно, я просто подумал, что было бы хорошо сообщить OP об этом, чтобы предотвратить ненужную душевную боль неспособность выполнить действительно хорошее решение. :) –