LINUX.ORG.RU

Bash скрипт

 


0

2

Приветствую.

Прошу помощи в написании части скрипта. Необходимо в цикле сравнить числовое значение (а) с парами числовых значений из массива (n) ( 1-2, 3-4 и.т.д. Если (а) принадлежит отрезкам массива, то .... , если же нет, то ....

Заранее благодарю.



Последнее исправление: cetjs2 (всего исправлений: 4)

LOOP (CUR_INDEX, ITEM) IN ARRAY
    IF (CUR_INDEX % 2 !== 0) CONTINUE
    IF (A <|>|=|>=|<= N &&|| A <|>|=|>=|<= ARRAY[CUR_INDEX + 1])
        DO

Любой скриптовый язык в руки – и вперде. А еще лучше – в jobs.

znenyegvkby
()

Ты знал что создают темы с названиями типа «помогите нужна помощная помощь» только невоспитанные ребята? Если ты пишешь на форум - это уже значит что нужна помощь.

Постановляю: тему удалить.

I-Love-Microsoft ★★★★★
()

Каникулы кончились, а мозги ещё не отошли от пьянки? Ладно, вот, держи прототип (за полноценным решением — в Job):

local MyNum="${1}"
local MyArr=( $(cat /path/to/file/with/numbers) )
for num in $(cat ${MyArr}); do
  if [ ${num} -eq "${MyNum}" ]; then
    echo "OK"
  else
    echo "ER"
  fi
done

Естественно, работать не будет, но куда копать, думаю, стало яснее.

r3lgar ★★★★★
()
Ответ на: комментарий от dgorski

Все равно я не понял как сравнивать попарно.

Ты берёшь число, с которым тебе надо сравнить число из аррая, затем берёшь строку чисел, с которыми надо сравнить число, сплитаешь его по пробелу и скармливаешь в цикле, предметом прохода которого будет служить аррай. Естественно, если у тебя число из аррая не является целым, то ты получишь фигню — у тебя просто не будет совпадать. Насколько я вижу, у тебя числа не числа, потому сам подумай, что с ними можно сделать, возможно, придётся городить ещё один цикл в цикле.

/me плохой объяснятор, да.

r3lgar ★★★★★
()
Последнее исправление: r3lgar (всего исправлений: 1)
Ответ на: комментарий от dgorski

я не понял как сравнивать попарно

Ну товарищ znenyegvkby-же вам все написал.

$ type dgorski 
dgorski is a function
dgorski () 
{ 
    (( $# % 2 == 1 )) || return 1;
    local a="$1";
    shift;
    while [[ -n $@ ]]; do
        if (( a >= $1 && a <= $2 )); then
            printf '%d ∈ [%d %d]\n' "$a" "$1" "$2";
        else
            printf '%d ∉ [%d %d]\n' "$a" "$1" "$2";
        fi;
        shift 2;
    done
}
$ dgorski 3 3 8 1 12 8 9
3 ∈ [3 8]
3 ∈ [1 12]
3 ∉ [8 9]
Zmicier ★★★★★
()

Слушай, а может тебе на python подошло бы? Недавно коллега попросил сделать ему скрипт с числами, я ему предложил это на python и это оказалось проще и быстрее.

P.S. Тему назвал уже лучше, но «как сравнить числа из массива» более подходящее. Тэги bash, python. Просто тэг «bash скрипт» - на него никто не подписан. Не придираюсь, вижу новичка и ненавязчиво подсказываю как лучше.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
arr=(1 2 3 4 5 6 7 8 9 10)
val=5

for ((i = 1; i <= ${#arr[@]}; i++))
do
	[[ ${arr[i]} -le $val && $val -lt ${arr[i+1]} ]] && echo "$val"
done
anonymous
()
Ответ на: комментарий от I-Love-Microsoft

Слушай, а может тебе на python подошло бы? Недавно коллега попросил сделать ему скрипт с числами, я ему предложил это на python и это оказалось проще и быстрее.

Историю успеха в студию. Или п******л.

ashot ★★★★
()
Ответ на: комментарий от ashot

Считай что второе, мне так проще :) Просто лично конкретно я bash знаю очень плохо, и для меня действительно на python оказалось и проще и быстрее. Но работа с числами в совсем простых случаях у меня удавалась и на bash. Если автору тему подходит решение на python - я сделаю это.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от ashot
a = 5
array = [[3, 7], [6, 8], [2, 7]]
print("a= %d, array= %s" % (a, str(array)))
for i in range(len(array)):
	if(array[i][0] <= a <= array[i][1]):
		print("%d: in range" % i)
	else:
		print("%d: out of range" % i)

Результат:

a= 5, array= [[3, 7], [6, 8], [2, 7]]
0: in range
1: out of range
2: in range
Другие ЛОРовцы предложили псевдокод с алгоритмом, я же сходу - рабочее решение. Python для такой задачи действительно проще, ну лично мне так кааца... Можно дополнить пример для случая если второе число в паре меньше чем первое.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от ashot

Не нужен специальный контекст для арифметики. Разве это не проще?

anonymous
()
Ответ на: комментарий от I-Love-Microsoft
for r in array:
    if r[0] <= a <= r[1]:
        ...

Можно ещё через map или filter.

mf = lambda r: (r[0] <= a <= r[1], r)

for belongs, r in map(mf, array):
    if belongs:
        print('%i is in range' % a, r)
    else:
        print('%i is not in range' % a, r)
    

Или, для целых чисел:

for l,r in array:
    if a in range(l, r+1):
        ...

anonymous
()
Ответ на: комментарий от I-Love-Microsoft

тэг «bash скрипт» - на него никто не подписан

А откуда он вообще взялся? Я так понимаю, что мы сейчас вообще в единственной ветке с ним. Куда написать, чтоб его слили с [bash]?

Zmicier ★★★★★
()

Еще немного отвлеку Ваше внимание. Как быть если сравнивать необходимо между 1-2, 3-4,5-6 и.т.д, т.е пропуская значения 2-3,4-5.

dgorski
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Пхытон? Проще??? Srsly???

Яфшоке!

anonymous
()
Ответ на: комментарий от dgorski

в написании части скрипта
сравнивать необходимо между 1-2, 3-4,5-6 и.т.д, т.е пропуская

м-да.. есть же длина массива: можно прогнать «i» от 1 до $(( нее / 2 )), а смотреть array[2*i-1] и array[2*i] ; или скипать итерацию если индекс чётный. или shift, можно и по посиксу (выглядит, конечно, похуже):

in_range() {
	x=$1
	shift 1
	while [ $# -gt 0 ]
	do
		[ "$1" -le "$x" ] && [ "$x" -lt "$2" ] && echo "[$1..$2)"
		shift 2
	done
}

in_range 7 $(seq 10)
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.