2015-12-13 3 views
0

У меня следующий вопрос:команда Bash (если заявление) Терминал

if [ (airport en1 -s|awk 'END{print NR—}’) -lt 11]; then 
    open ~/Desktop/1-10.mp3 
else if -ge 10 -lt 15 
    then ~/Desktop/11-14.mp3 
else if -ge 14 -lt 18 
    then ~/Desktop/15-17.mp3 
else if -ge 17 -lt 21 
    then ~/Desktop/18-20.mp3 
else if -ge 20 -lt 24 
    then ~/Desktop/21-23.mp3 
else if -ge 23 -lt 27 
    then ~/Desktop/24-26.mp3 
else if -ge 26 -lt 30 
    then ~/Desktop/24-27.mp3 
else if -ge 29 -lt 36 
    then ~/Desktop/30-36.mp3 
else if -ge 35 -lt 41 
    then ~/Desktop/36-40.mp3 
fi 

В основном я хочу, чтобы это отсканировать сколько wifis есть Airport en1 -s) Тогда я позволю это рассчитывать без первой линии |awk 'END{print NR—}’ , а затем я имеют ряд команд if, которые мне все необходимы, чтобы получить более чувствительный результат. Но сейчас это не работает.

Может ли кто-нибудь помочь мне, пожалуйста? (да и я уже читал Баш учебник ...)

+1

Как насчет «не работает»? Во-первых, чтобы выполнить команду и использовать ее результат, вы хотите '$ (...)' не просто '(...)', а также следить за «умными кавычками», как будто кажется, что у вас может быть в первом 'if', так как они не анализируют право в' bash', а также вам нужно пробел перед закрывающим ']', в белом пространстве нет необязательного. Кроме того, посмотрите на 'elif', а не на все вложенные' else if', для каждой из которых потребуется закрытие 'fi' –

+0

. Среди других проблем вы, похоже, считаете, что второе и последующие сравнения будут неявно использовать значение из первого. Они не будут. –

+0

Хорошо, я понимаю, что вы имеете в виду. Но как я могу это сделать? – shirinmalina

ответ

0

перехватывать вывод в переменную, так что вы можете сделать различные тесты на нем

Условный заявления все нужно действует автономно команды

+0

Как это сделать, если у меня уже есть счетная команда? $ (аэропорт en1 -s | awk 'END {print NR--}') – shirinmalina

+0

@shirin извините за хромой ответ, опробовав проводку с моего мобильного телефона. Захват в переменную вместо первой, если –

+0

Не проблема, хотя, я ценю любую помощь. Я пытаюсь поместить сканирование и подсчет в переменную s = 'airport en1 -s | awk' END {print NR--} '' , как только я нажимаю кнопку ввода, я получаю сообщение об ошибке zsh: команда не найдена: NR--} – shirinmalina

2

Есть довольно много проблем, даже в этом большую часть кода (остальное просто повторяет проблемы, показанные здесь):

if [ (airport en1 -s|awk 'END{print NR—}’) -lt 11]; then 
    open ~/Desktop/1-10.mp3 
else if -ge 10 -lt 15 
    then ~/Desktop/11-14.mp3 
  • ] - отдельный аргумент команды [; интервал в оболочке имеет решающее значение.

  • должен быть кавычка (апостроф) ' (отмечено Eric Renouf в его comment).

  • else if должно быть написано elif. Как написано, вам понадобится дополнительно fi для каждого else if.

  • Система, вероятно, не предоставляет команду -ge, которую вы пытаетесь запустить.

  • Вторая и последующие команды не имеют префикса open.

  • И в первой строке ( не так, как написано. Это выглядит, как если бы вы имели в виду что-то вроде:

    if [ $(airport en1 -s | awk 'END {print NR}') -lt 11 ]; then 
    

    Это запускает команду airport с двумя аргументами и посылает вывод awk который печатает число строк он прочитал.

  • Использование awk для подсчета строк вместо wc -l можно считать излишним. Это, однако, будет работать.

  • После NR у вас появляется эмблема ; что, вероятно, недействительно. Я не уверен, что вы намеревались использовать -- (двойная тире) или что-то еще. A --, вероятно, будет синтаксически действительным, но функционально бессмысленным (нет смысла в пост-декременции числа, если вы его больше никогда не будете использовать).

  • Ваши граничные условия немного подозрительны.

  • Неустойчивые группировки (10, 4, 3, 3, 3, 3, 4, 6, 5) также немного странны.Обратите внимание, что вы пытаетесь запустить 24-27.mp3 для того, что можно ожидать от 27-30.mp3, и вы запустите 30-36.mp3 за то, что можно было ожидать от 31-36.mp3.

Может быть, вам действительно нужно:

num_mp3=$(airport en1 -s | awk 'END {print NR}') 
if [ "$num_mp3" -le 10 ] 
then open ~/Desktop/1-10.mp3 
elif [ "$num_mp3" -le 14 ] 
then open ~/Desktop/11-14.mp3 
elif [ "$num_mp3" -le 17 ] 
then open ~/Desktop/15-17.mp3 
… 
fi 

Обратите внимание, что тестирование не достигнет elif, если число меньше или равно 10, так что нет необходимости повторять краевой тест в это состояние.

+0

WOW это потрясающе! Как вы, наверное, догадались, что я довольно новичок в кодировании, так что это здорово учиться. Теперь я хочу, чтобы он повторял этот код автоматически каждые 10 секунд. Интернет я нашел это: часы -n 10 num_mp3 = $ (аэропорт en1 -s | AWK 'END {печать NR}') если [ "$ num_mp3" -le 10] затем открыть ~/Desktop/1 .mp3 elif ["$ num_mp3" -le 14] затем открыть ~/Desktop/11-14.mp3 elif ["$ num_mp3" -le 17] затем открыть ~/Desktop/15-17.mp3 ... fi но это не работает – shirinmalina

+0

Я не знаю, что делает команда 'watch' (это не на моем Mac). Вам, вероятно, нужно будет поместить назначение и условное в сценарий оболочки (например, '~/bin/run-mp3.sh', если вы создали себе подкаталог' bin'), убедитесь, что он является исполняемым ('chmod 755 ~/bin/run-mp3.sh'), а затем выполните что-то вроде 'watch -n 10 ~/bin/run-mp3.sh', чтобы запустить его. У меня нет команды «аэропорт» на моем пути; возможно, вы как-то управляете утилитой Airport из командной строки - или, может быть, то, что вы используете, полностью не связано с сетью аэропортов Mac. –

+0

@JonathanLeffler: 'watch (1) - выполнять программу периодически, показывая выходной полноэкранный режим. Варианты использования аналогичны случаям, когда вы используете 'tail -f' в файле журнала, но каждый раз он показывает весь вывод. –

Смежные вопросы