однострочный оператор if в сценарии оболочки не работает - PullRequest
11 голосов
/ 25 февраля 2012

Это мой код:

#!/bin/bash
cat input$1 | ./prog$1 > output$1 && if[ "$2" != "" ]; diff output$1 expected$1;

Это тогда произойдет:

$ ./run.sh
./run.sh: line 2: if[ no !=  ]: command not found
$

Я думал, что смогу выполнить операторы if в одной строке?в этом ли проблема?

Ответы [ 2 ]

18 голосов
/ 25 февраля 2012

получается, что между if и [ должен быть пробел. Кроме того, я вставил ключевые слова then и fi.

Сработало следующее.

#!/bin/bash
cat input$1 | ./prog$1 > output$1 && if [ "$2" != "" ]; then diff output$1 expected$1; fi

EDIT:

как прокомментировано ниже (и в другом ответе), это может быть элегантно сокращено до:

cat input$1 | ./prog$1 > output$1 && [ "$2" != "" ] && diff output$1 expected$1

В этом случае мне даже не нужно помнить ни одно из правил использования конструкции if:)

3 голосов
/ 27 февраля 2012

бросить если. [] создаст новую «команду», и вы можете запустить diff или что-либо еще после того, как он завершится с 0, используя && (запустить следующий, если предыдущий завершится нормально). здесь:

echo lol &&  [ $((10-1)) -eq 9 ] && echo math\!

и ваш однострочный:

#!/bin/bash
cat input$1 | ./prog$1 > output$1 && [ "$2" != "" ] && diff output$1 expected$1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...