Сравнение отрицательных значений в bash с использованием массивов

У меня есть интересная проблема, которую я пытаюсь решить, но я пока не могу этого сделать.

Предположим, что у меня есть 2 массива.

  • Повторно заменять строку
  • Убить все фоновые задания
  • Скопируйте папку без ее иерархии / дерева
  • bash 4.3 "множественные точки" команды терпят неудачу молча
  • В bash, как отложить интерполяцию переменной, которая имеет динамическую переменную в своей строке
  • Когда я могу использовать временную IFS для разделения поля?
  • Массив:

    1 -2 3 -2 2 -4 

    Массив 2:

     -2 -3 4 5 2 -5 

    Я хочу иметь возможность реально сравнить i-е значение как Array one и Array two :

    • Если оба отрицательные, я бы ввел в Array Three 0
    • Если они оба положительные, я добавлю 1
    • Если они противоположности, мне нужно вставить 2

    Вывод:

     2 0 1 2 1 0 

    Как я могу это сделать ?

  • Поведение bash при удалении каталога, в котором вы находитесь
  • Могу ли я заставить bash игнорировать ведущий `:`, когда он присутствует?
  • синтаксис синтаксиса bash и ;; терминаторы
  • получить приблизительный размер каталога (рекурсивно, включая все файлы и подкаталоги)
  • Разделитель в разбиении слов
  • Сценарий Bash для цикла с поиском и многими каталогами
  • 2 Solutions collect form web for “Сравнение отрицательных значений в bash с использованием массивов”

    Если вы знакомы с C, C ++ или Java, то вы найдете этот вариант bash 's for -loop довольно знакомым тоже. bash выполняет арифметическую оценку с помощью (( ... )) поэтому мы будем использовать это при сравнении значений:

     array1=( 1 -2 3 -2 2 -4 ) array2=( -2 -3 4 5 2 -5 ) array3=( ) for (( i=0; i < ${#array1[@]}; ++i )); do if (( array1[i] < 0 && array2[i] < 0 )); then array3[$i]=0 elif (( array1[i] > 0 && array2[i] > 0 )); then array3[$i]=1 else array3[$i]=2 fi done echo "${array3[@]}" 

    Это также хорошо работает с оболочкой ksh93 , из которой bash получил множество своих функций.

    Прямой путь:

     arr1=(1 -2 3 -2 2 -4) arr2=(-2 -3 4 5 2 -5) i=0 while [[ "$i" -lt "${#arr1[@]}" ]]; do a=$(( ${arr1[$i]} * ${arr2[$i]} )) if [[ "$a" -lt 0 ]]; then echo 2 else if [[ "${arr1[$i]}" -gt 0 ]]; then echo 1 else echo 0 fi fi : "$((i = i + 1))" done | paste -sd ' ' - 
    Linux и Unix - лучшая ОС в мире.