сценарий удара пытается выполнить переменную

Если Вы происходите из Linux, Вы могли бы дать TrueOS попытку.

Это - FreeBSD, но с вниманием на настольную полировку и простоту в употреблении. FreeBSD исторически был сервером ОС.

Linux и BSD довольно подобны в этом, они совместно используют объем программного обеспечения, которое работало бы на любом из них. Случайному настольному пользователю рабочий стол BSD не будет казаться что отличающимся.

Большие различия (по-моему, конечно):

  • Пространство пользователя (Linux использует GNU, в то время как BSD использует BSD),

  • Интеграция (Linux является набором различных усилий, BSD, намного более объединена в ядре),

  • При упаковке (Linux обычно управляет установленным программным обеспечением в двоичных пакетах - BSD обычно управляет деревом "портов", которое Вы используете для создания программного обеспечения из источников),

4
28.04.2011, 04:13
2 ответа

Попробуйте это:

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 выполняет вывод этого и видит, успешно ли это. В этом случае Вы действительно хотите протестировать успех команды, которую Вы вставляете $(...). Также хорошо заключить переменные в кавычки при использовании.

3
27.01.2020, 20:53
  • 1
    @penguin259: Это работает отлично. Я предполагаю, что запутался о том, как использовать if по сравнению с $(...), и тестирование возвращаемых значений (в основном я пытался протестировать ли grep возвращенный что-либо или не).Спасибо! –  Wolf 28.04.2011, 04:50
  • 2
    @Wolf, в этом случае, использование grep -q .... –  glenn jackman 28.04.2011, 05:38
  • 3
    @Glenn я использовал перенаправление, поскольку это более портативно. Некоторые власти не поддерживают-q или рассматривают его как-s. –  penguin359 28.04.2011, 06:02
  • 4
    @Wolf Здесь - еще немного explanatin. Канал является типом сложной КОМАНДЫ, комбинирующей несколько простых КОМАНД в конвейере. При использовании нескольких простых команд вместе в канале, статус возврата целого канала равен самому большому статусу возврата любой отдельной простой команды. В основном это означает, что канал только считают успешным, если каждая команда была успешна. Полный синтаксис if if COMMAND1; then COMMAND2; ...; elif COMMAND3; then COMMAND4; ..; else COMMAND5; fi ; может быть заменен новой строкой. В основном, если COMMAND1 успешен, COMMAND2 выполняется так на –  penguin359 28.04.2011, 06:08
  • 5
    хороший ответ, но это было бы более читаемо: если [["$variable" = ~ ^ [0-9] \{1, \}]] –  Kim 28.04.2011, 08:30

Ваш сценарий не пытается выполнить Вашу переменную.
Это пытается выполнить вывод от '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
3
27.01.2020, 20:53

Теги

Похожие вопросы