Как присвоить выражение шарика переменной в сценарии Bash?

Примечание: попытка получить свойство ошибки, отличной от объекта

Случается, когда вы пытаетесь получить доступ к объекту объекта, пока нет объекта.

Типичный пример для non-object notice будет

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

В этом случае $users представляет собой массив (а не объект), и он не имеет никаких свойств.

Это похоже для доступа к несуществующему индексу или ключу массива (см. Примечание: Undefined Index ).

Этот пример значительно упрощен. Чаще всего такое уведомление сигнализирует неконтролируемое возвращаемое значение, например. когда библиотека возвращает NULL, если объект не существует или просто неожиданное значение, отличное от объекта (например, в результате Xpath, структуры JSON с непредвиденным форматом, XML с неожиданным форматом и т. д.), но код не проверяет такой условие.

Поскольку эти не-объекты часто обрабатываются дальше, часто возникает фатальная ошибка при вызове метода объекта для не-объекта (см.: Неустранимая ошибка: вызов члену function ... на не-объекте ), останавливая скрипт.

Его можно легко предотвратить, проверив условия ошибки и / или переменную, соответствующую ожиданию. Здесь такое уведомление с примером DOMXPath:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

Проблема заключается в доступе к свойству nodeValue первого поля, пока он не был проверен, существует ли он или нет в $result коллекция. Вместо этого он платит, чтобы сделать код более явным, назначив переменные объектам, на которых работает код:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if ($div) {
    $divText = $div->nodeValue;
}
echo $divText;

Связанные ошибки:

42
задан Ciro Santilli 新疆改造中心法轮功六四事件 21 June 2016 в 12:02
поделиться

4 ответа

Я думаю, что это - порядок расширений:

порядок расширений: brace expansion, расширение тильды, параметр, variable и арифметическая замена расширения и команды (выполненный слева направо вид), разделение слова, и pathname expansion.

Поэтому, если Вашей переменной заменяют, расширение фигурной скобки больше не происходит. Это работает на меня:

eval ls $dirs

Быть очень осторожным с оценкой. Это выполнит материал дословно. Таким образом, если директора будут содержать f{m,k}t*; some_command, то some_command будет выполняться после законченного ls. Это выполнит строку, которую Вы даете eval в текущей оболочке. Это передаст /content/dev01 /content/dev02 ls, существуют ли они или нет. При помещении * после того, как материал делает его расширением пути, и это опустит несуществующие пути:

dirs=/content/{dev01,dev02}*

я не на 100% уверен в этом, но это имеет смысл мне.

30
ответ дан Johannes Schaub - litb 26 November 2019 в 23:49
поделиться

Здесь превосходное обсуждение того, что Вы пытаетесь сделать.

короткий ответ - то, что Вы хотите массив:

dirs=(/content/{dev01,dev01})

, Но то, что Вы делаете с результатами, может стать более сложным, чем, к чему Вы стремились, я думаю.

21
ответ дан Octavia Togami 26 November 2019 в 23:49
поделиться

Это не имя файла globbing, это - расширение фигурной скобки. Различие является тонким, но оно существует - в имени файла globbing Вы только получил бы существующие файлы в результате, в то время как в расширении фигурной скобки можно генерировать любой вид строки.

http://www.gnu.org/software/bash/manual/bashref.html#Brace-Expansion

http://www.gnu.org/software/bash/manual/bashref.html#Filename-Expansion

Теперь, это - то, что работало на меня:

#!/bin/sh
dirs=`echo ./{dev01,dev02}`
ls $dirs
9
ответ дан Yoni Roit 26 November 2019 в 23:49
поделиться
ls `echo $dirs` 

работы под cygwin.

0
ответ дан Zsolt Botykai 26 November 2019 в 23:49
поделиться
Другие вопросы по тегам:

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