Проще использовать инструмент, поддерживающий поисковые запросы:
$ s="battery.charge: 90 battery.charge.low: 30 battery.runtime: 3690 battery.voltage: 230.0 device.mfr: MGE UPS SYSTEMS device.model: Pulsar Evolution 500"
$ grep -oP '\S+:\s+.*?(?=\s+\S+:|$)' <<< "$s"
battery.charge: 90
battery.charge.low: 30
battery.runtime: 3690
battery.voltage: 230.0
device.mfr: MGE UPS SYSTEMS
device.model: Pulsar Evolution 500
Если вам нужен результат в виде массива:
$ IFS=$'\n' foo=($(grep -oP '\S+:\s+.*?(?=\s+\S+:|$)' <<< "$s"))
$ for i in "${!foo[@]}"; do echo "$i<==>${foo[i]}"; done
0<==>battery.charge: 90
1<==>battery.charge.low: 30
2<==>battery.runtime: 3690
3<==>battery.voltage: 230.0
4<==>device.mfr: MGE UPS SYSTEMS
5<==>device.model: Pulsar Evolution 500
РЕДАКТИРОВАТЬ: Объяснение регулярного выражения:
'\S+:\s+.*?(?=\s+\S+:|$)'
\ S +
соответствует одному или нескольким непробельным символам :
соответствует :
\ s +
соответствует одному или нескольким пробелам после :
.*?
обозначает нежадное совпадение (? = \ S + \ S +: | $)
- это предварительное утверждение для определения наличия:
Таким образом, строка разбивается на части, например battery.charge: 90
, ... device.mfr: MGE UPS SYSTEMS
, ...
Ниже приведены ссылки на несколько онлайн-анализаторов регулярных выражений:
Предположение:У меня сложилось впечатление, что как только вы попытались установить Node и NPM, вы пытаетесь выполнить их, не зная фактического пути к ним в скрипте. Это то, на чем я основываю свой ответ.
Вызывающий узел и NPM:
Эта строка должна помочь:
$(which <command>) <command arguments>
Таким образом, для некоторых пакетов NPM вы можете использовать:
$(which npm) install <packagename>
Это связано с тем, что полный путь к исполняемому файлу (, если он указан перед чем-либо еще в bash ), является тем, что он собирается выполнить. Конструкция "$ ()" буквально заменит этот исполняемый файл в bash.
Пример:
$(which yes) IT WORKS!
Который распечатает "ЭТО РАБОТАЕТ!" на экране несколько раз, пока не будет прервано.
Как отмечалось в комментариях, если вы знаете, куда будут установлены Node и NPM, вы можете просто использовать их полные пути для их выполнения (, хотя см. примечание, чтобы узнать, как это сделать лучше ).
(Если вам нужно установить ruby, вы сами по себе, хотя я думаю, что вы просто сделаете что-то похожее на эту строку "curl" ).
ПРИМЕЧАНИЕ.:У вас уже есть «/usr/local/bin» и «/usr/bin» в переменной $PATH вашего скрипта, поэтому, если у вас не происходит чего-то шаткого, вы можете запустить «ruby» и "варить" без указания их полных путей.
ДОБАВЛЕНО:Как найти node
.
Я предлагаю вам удалить node@8 и повторно -установить node@8 с опцией --verbose
.
brew uninstall node@8
brew install --verbose node@8
Может показывать этапы установки. Надеюсь, из вывода вы сможете найти расположение node
и его символические ссылки.
Или,
Вы можете найти пути к установленным файлам из пакета узла с помощью команды brew list
.
brew list node@8
Показывает все установленные файлы.
И затем, если вы можете использовать GNU find
, он может найти символическую ссылку определенного файла.
find -L /dir/to/start/find -samefile /the/path/of/the/original/file
Если вы найдете символическую ссылку узла, созданную brew, добавьте путь к $PATH. Если символической ссылки не существует, вы должны сделать символическую ссылку самостоятельно или добавить путь к исходному файлу node
.
Ответ вызван непониманием вопроса:Как использовать which
и переменные
Я назначаю путь переменной вот так:
#!/bin/bash
NODE=`which node`
NPM=`which npm`
echo "Node.js path: ${NODE}"
$NODE -v
echo "npm path: ${NPM}"
$NPM -v
ПРИМЕЧАНИЕ:`which node`
равно $(which node)
. Обратные кавычки (обратные кавычки )и $ ()возвращают результат.
which
возвращает полный путь к команде, поэтому `which node`
возвращает путь, по которому установлен node.js. И присваивается переменной $NODE
.
Brew обычно устанавливает файлы в /usr/local/Cellar
и символически связывает их с /usr/local/bin
.
$PATH
на этих новых коробках, вероятно, не содержит /usr/local/bin
. Итак, у вас есть два варианта:
Прочтите о brew и узнайте, куда будут установлены эти пакеты, проверьте статус выхода для brew install...
, а затем жестко задайте путь к новым бинарным файлам/скриптам, которые устанавливает brew, изменив свой скрипт, включив в него абсолютный пути.
Если brew install foo
сработало, то двоичный файл foo
должен быть доступен для вызова с помощью /usr/local/bin/foo
.
Это должно дать вам подсказку, сработало ли brew install
:
/usr/local/bin/brew install node@8
status=$(echo $?)
if [[ "$status" -ne 0 ]]; then
echo "Brew install node failed!"
exit 1
fi
...
Если вы хотите полностью автоматизировать этот скрипт, проверьте наличие ошибок при вызове команд и обработайте их .
Обновите системный путь, прежде чем сценарий попытается использовать его для разрешения команд. Это должно сработать:
#!/bin/bash
export PATH="/usr/local/bin:$PATH"
...
Это не зависит от окружения bash пользователя и должно исправить приведенные выше команды which
. Но подумайте, нужны ли в любом случае ваши новые коробки /usr/local/bin
в $PATH
?