#arrays #bash #if-statement
#массивы #bash #if-statement
Вопрос:
len=${#newarray[*]}
for ((i=0;i<${len};i )); do
if [[ "${newarray[$i]}" =~ ^[[:digit:]] $ ]]; then
echo "${newarray[$i]}"
fi
это мой код, мне нужно получить только цифры из списка массива и их количество. но есть проблема, которая показывает только алфавитные значения.
данный getdata.txtcontains —
cat
dog
1234
pl345
567ab
12234
Комментарии:
1. Ваш
if/else
обратный. Вы должны выполнитьecho
вif
иcontinue
вelse
, посколькуif
соответствует числовым значениям.2. Почему вы повторяете
newfolders
вместоvalue
?3. Вы можете просто использовать
len
infor ((i=0;i<len;i )); do
(переменные автоматически расширяются внутри(( ... ))
)4. да, я изменил if-else, но он также захватывает pl345 @Barmar
5. спасибо, я сделал это таким образом, моя проблема с if else stement @DavidC.Rankin
Ответ №1:
Имея:
value=(cat dog 1234 pl345 567ab 12234)
Вы могли бы напечатать «только цифры»:
$ printf "%sn" "${value[@]}" | grep -o "[0-9]*"
1234
345
567
12234
или, может быть, вам нужны «только строки, содержащие только числа»:
$ printf "%sn" "${value[@]}" | grep -x "[0-9]*"
1234
12234
или, может быть, вам нужны «только строки с числом»:
$ printf "%sn" "${value[@]}" | grep "[0-9]"
1234
pl345
567ab
12234
Ответ №2:
Ваш if/else
обратный.
value=(cat dog 1234 pl345 567ab 12234)
len=${#value[*]}
for ((i=0;i<${len};i )); do
if [[ "${value[$i]}" =~ ^[[:digit:]] $ ]]; then
echo "${value[$i]}"
fi
done
Это выводит:
1234
12234
Ответ №3:
Существует способ сделать это без регулярных выражений при bash
использовании shopt
:
# enable extended glob
shopt -s extglob
value=(cat dog 1234 pl345 567ab 12234)
# lop through array and print only it contains 1 digits
for v in "${value[@]}"; do [[ $v == ([0-9]) ]] amp;amp; echo "$v"; done
1234
12234
Ответ №4:
Вероятно, вам следует использовать два вложенных цикла:
- перебор всех элементов массива
- выполните итерацию по всем символам в элементе, проверьте, является ли символ цифрой
(2), вероятно, было бы проще с grep, но поскольку мы говорим о реализации bash, я придумал это:
#!/bin/bash
a=(cat dog 1234 pl345 567ab 12234) # input array
for s in "${a[@]}"; do # iterate over all elements of our array
res=''
for ((i=0;i<${#s};i )); do # iterate over all chars of element $s
c="${s:$i:1}" # $c is now char at $i position inside $s
case "$c" in
[0-9]) res="${res}${c}" # append digit to res
esac
done
[ -n "$res" ] amp;amp; echo "$res" # if $s contains at least 1 digit, print it
# you may add $res to another array here if needed
done
Ответ №5:
Просто
tr -dc '0-9n' <getdata.txt
Ответ №6:
Вы можете использовать:
$ cat getdata.txt |grep -P '^[0-9] $'