Как узнать, является ли значение четным или нечетным в bash? - PullRequest
2 голосов
/ 05 августа 2010

Я создаю базу данных фильмов, и мне нужно найти медиану для рейтингов.Я действительно новичок в bash (это мое первое задание).

Я написал:

let evencheck=$"(($Amount_of_movies-$Amount_of_0_movies)%2)"
if [ $evencheck==0 ] 
then
let median="(($Amount_of_movies-$Amount_of_0_movies)/2)"
else
let median="(($Amount_of_movies-$Amount_of_0_movies)/2)+1"
fi

Когда $amount_of_movies = 6 и $amount_of_0_movies = 1.Я ожидаю, что медиана будет 3. но это 2. Почему это?

Ответы [ 6 ]

4 голосов
/ 05 декабря 2012
#!/bin/bash

if (( $# != 1 )) ; then
    echo "syntax:  `basename $0` number"
    exit 255
else
    _value=$(expr $1 % 2)
    (( $_value == 0 )) && exit 1 || exit 0
fi
1 голос
/ 05 августа 2010

попробуйте это:

let evencheck="(($Amount_of_movies-$Amount_of_0_movies)%2)"
if [ $evencheck -eq 0  ] 
then
   let median="(($Amount_of_movies-$Amount_of_0_movies)/2)"
else
   let median="(($Amount_of_movies-$Amount_of_0_movies)/2)+1"
fi

Удаление $, а затем проверка на числовое равенство.

0 голосов
/ 06 августа 2010

Внешние скобки и ни одна из кавычек не нужны в том, что у вас есть (они могут быть в других обстоятельствах).Кроме того, в выражении let вы можете опустить знак доллара в именах переменных.

let evencheck=(Amount_of_movies-Amount_of_0_movies)%2
if [ $evencheck == 0 ]  
then
    let median=(Amount_of_movies-Amount_of_0_movies)/2
else
    let median=(Amount_of_movies-Amount_of_0_movies)/2+1
fi

Если вы используете форму (()) вместо let, вы можете использовать пробелы, чтобы сделать ваши формулы болееудобочитаемый.Вы также можете использовать их в if заявлениях:

(( evencheck = ( Amount_of_movies - Amount_of_0_movies ) % 2 ))
if (( evencheck == 0 ))
then
    (( median = ( Amount_of_movies - Amount_of_0_movies ) / 2 ))
else
    (( median = ( Amount_of_movies - Amount_of_0_movies ) / 2 + 1 ))
fi
0 голосов
/ 05 августа 2010

Ваш код не анализируется.Чтобы оценить выражения в Bash, вы говорите:

let evencheck="$((($Amount_of_movies-$Amount_of_0_movies)%2))"

То есть оцениваете арифметику следующим образом: $(( ... ))

Тем не менее, ваша проблема заключается в условности.См. man test.

if [ $evencheck = 0 ]; then

Вы должны обернуть знак равенства пробелами с обеих сторон.Используйте один знак равенства.

0 голосов
/ 05 августа 2010

Медиана имеет какое-то значение по умолчанию?То, как я это вижу, даже не входит в if.

(6-1) % 2
5 % 2
1, not 0
0 голосов
/ 05 августа 2010

попробуйте это в вашем тесте if:

[ "$evencheck" == 0 ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...