Если Вы происходите из Linux, Вы могли бы дать TrueOS попытку.
Это - FreeBSD, но с вниманием на настольную полировку и простоту в употреблении. FreeBSD исторически был сервером ОС.
Linux и BSD довольно подобны в этом, они совместно используют объем программного обеспечения, которое работало бы на любом из них. Случайному настольному пользователю рабочий стол BSD не будет казаться что отличающимся.
Большие различия (по-моему, конечно):
Пространство пользователя (Linux использует GNU, в то время как BSD использует BSD),
Интеграция (Linux является набором различных усилий, BSD, намного более объединена в ядре),
При упаковке (Linux обычно управляет установленным программным обеспечением в двоичных пакетах - BSD обычно управляет деревом "портов", которое Вы используете для создания программного обеспечения из источников),
Попробуйте это:
variable="3 things"
if echo "$variable" | grep "^[0-9]\{1,\}" >/dev/null 2>&1 #if $variable begins with [0-9]
then
echo "$variable" | sed 's/ .*$//'
else
echo "0"
fi
При использовании $(...)
нотация, Вы выполняете внутреннюю команду и помещаете, она производится в, он - место. Директива if
выполняет вывод этого и видит, успешно ли это. В этом случае Вы действительно хотите протестировать успех команды, которую Вы вставляете $(...)
. Также хорошо заключить переменные в кавычки при использовании.
Ваш сценарий не пытается выполнить Вашу переменную.
Это пытается выполнить вывод от 'grep'...
Причина, которую это пытается выполнить 3, по той же причине как тогда, когда if command
встречен в сценарии.. Команда выполняется, и ее код выхода тестируется if
.. Ваши grep производят подарки if 3
колотить.
if command ;then do-something; fi
хорошо потому что if
тестирует код выхода command
.
if 3 ; then do-somethin; fi
перестанет работать, потому что 3
не команда... Вот простой пример для указания if command...
function error() { return 1 ; }
if error ;then echo A-cond1 ; else echo A-cond2 ;fi
if echo -n;then echo B-cond1 ; else echo B-cond2 ;fi
# `if 3` fails as you already know..
# output:
A-cond2
B-cond1
Можно легко избежать всего этого и позволить 'sed' обработать тесты условия и вывод.
for var in \
"3 things" \
" 1 leading space" \
"10 green bottles" \
"albatross"
do
echo "$var" |sed -e "s/^\([0-9]\+\).*/\1/" \
-e "s/^[^0-9].*/0/"
done
Вывод:
3
0
10
0
if
по сравнению с$(...)
, и тестирование возвращаемых значений (в основном я пытался протестировать лиgrep
возвращенный что-либо или не).Спасибо! – Wolf 28.04.2011, 04:50grep -q ...
. – glenn jackman 28.04.2011, 05:38if
if COMMAND1; then COMMAND2; ...; elif COMMAND3; then COMMAND4; ..; else COMMAND5; fi
;
может быть заменен новой строкой. В основном, если COMMAND1 успешен, COMMAND2 выполняется так на – penguin359 28.04.2011, 06:08