LINUX.ORG.RU

подскажите по bash скрипту

 


0

1

добрый день.

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

подскажите почему скрипт все время выдает «too low», не могу понять.

m=$(ls -1 *.* | wc -l)

echo 'Hello! Guess the number of files in the current directory.'

echo 'Enter the number:'
read $n

while [[ $n -ne $m ]]
do
    if [[ $n -lt $m ]]
    then
<------>echo 'You are not right. Too low!'
<------>echo 'Enter the number:'
<------>read $n
    elif [[ $n -gt $m ]]
    then.
<------>echo 'You are not right. Too high!'
<------>echo 'Enter the number:'
<------>read $n
    else
<------>echo 'Congratiulations! You are right!'>
    fi
done

Можешь еще так сделать: read -p ’Enter the number: ’ n

вместо: echo ‘Enter the number:’ read n

dumasti
()
Ответ на: комментарий от lefej

А строку: echo ‘Congratiulations! You are right!’ поставь в конце цикла, цикл закончится, как только будет выполнено условие и эту строку не покажет.

dumasti
()

Про $ вам уже сказали, но в принципе написано плохо. Во-первых, у вас не правильно посчитает количество файлов, если в именах будет перевод строки. Сообщение о правильности с первого раза не выведется, а потом, цикл никогда не завершится. Всё что одинаковое надо вносить внутрь цикла.

Короче, надо как-то так:

#!/usr/bin/env bash

declare -i m
for f in *.*; do
        m+=1
done

echo 'Hello! Guess the number of files in the current directory.'

while read -p 'Enter the number: ' n; do
    if [[ n -lt m ]]; then
        echo 'You are not right. Too low!'
    elif [[ n -gt m ]]; then
        echo 'You are not right. Too high!'
    else
        echo 'Congratiulations! You are right!'
        break
    fi
done

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

Я не согласен, цикл завершится когда количество посчитанных строк будет равно числу введенному. просто завершится он без вывода о том, что количество угадано.

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

цикл завершится

А, ну да. Беглое чтение оконфузило эти табуляции с <----> и прочее нагромождение read, что доскональный разбор сбойнул. :)

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

в вашем варианте тоже подсчет будет ошибочный, он будет считать файлы по патерну ., а если фалы будут не test.sh а test ? лучшим варантом будет просто *

dumasti
()

<------>

«Alt»+«Shift»+"-" переключает отображение этого в mcedit.

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

в вашем варианте тоже подсчет будет ошибочный, он будет считать файлы по патерну ., а если фалы будут не test.sh а test ? лучшим варантом будет просто *

Это вопрос не ко мне. Такой паттерн выбрал ТС, может именно это ему и надо.

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

dash не bash. (( )), как и [[ ]] – это башизмы. [ ] (test, иными словами) работает везде.

Но у TS в шебанге написано bash, так что ему можно.

Upd. А нет, не у TS, а в подскажите по bash скрипту (комментарий). У TS непонятно, что за shell.

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

(( )), как и [[ ]] – это башизмы.

Ну тогда лучше я пусть буду в неведении, чем буду садиться на иглу.

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

Сравнение чисел лучше делать через круглые скобки:

Кто это вам сказал? Сегодня там целые, завтра добавится ещё и другая логика, со строками, файлами и пр. Скобочки хороши, когда надо сделать что-то типа ((a+b<c))

vodz ★★★★★
()

Бестолковое по своей ненужности. Когда такой ерундой занимаются обычно это делают «в темноте и под одеялом».

anonymous
()
Ответ на: комментарий от vodz
while read -p 'Enter the number: ' n && [[ "${n}" != "${m}" ]]; do
  if [[ "${n}" =~ ^[[:digit:]]+$ ]]; then
    [[ "${n}" -lt "${m}" ]] && echo 'You are not right. Too low!' || echo 'You are not right. Too high!'
  fi
done
echo 'Congratiulations! You are right!'
sudoapter
()
Ответ на: комментарий от sudoapter

Это «оптимизация» ради оптимизации. Так у вас будет выведено «You are right!» для EOF. Кавычки для «${n}» тут не нужны, в [[ «${n}» -lt «${m}» ]] не нужны даже ${}

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

Я следовал учебнику:

Этот учебник правильный для [ ], но для [[ ]] и (( )) там в принципе не показано, чем оно отличается и потому никуда не годится. Впрочем, это относится к выделенному жирным, в примерах без выделения таки проскакивает написание без кавычек.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от ashot

Чем лучше?

Вопрос эстетики: вместо `-lt` и `-gt` в коде будут более человекочитаемые `>` и `<`.

spirit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.