Однострочный оператор if в оболочке script не работает

Это мой код:

#!/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
$

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

Ответ 1

получается, что между 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:)

Ответ 2

отмените if. [] будет порождать новую "команду", и вы можете запустить 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