Сценарий Bash, чтобы перейти в каталог и выполнить команды, дает & ldquo; Command not found & rdquo; [Дубликат]

Intro

Сначала у вас есть строка. JSON не является массивом, объектом или структурой данных. JSON - текстовый формат сериализации - так что причудливая строка, но все же просто строка. Декодируйте его в PHP с помощью json_decode() .

 $data = json_decode($json);

В нем вы можете найти:

Это то, что может быть закодировано в JSON. Или, точнее, это версии PHP, которые могут быть закодированы в JSON.

В них нет ничего особенного. Они не являются объектами JSON или массивами JSON. Вы расшифровали JSON - теперь у вас есть основные повседневные типы PHP .

Объекты будут экземплярами stdClass , встроенным классом, который просто generic thing , что здесь не важно.


Доступ к свойствам объекта

Вы получаете доступ к свойствам одного из этих объектов так же, как и для публичных нестатических свойств любого другого объекта, например $object->property.

$json = '
{
    "type": "donut",
    "name": "Cake"
}';

$yummy = json_decode($json);

echo $yummy->type; //donut

Доступ к элементам массива

Доступ к элементам одного из этих массивов осуществляется так же, как и для любого другой массив, например $array[0] .

$json = '
[
    "Glazed",
    "Chocolate with Sprinkles",
    "Maple"
]';

$toppings = json_decode($json);

echo $toppings[1]; //Chocolate with Sprinkles

Итерации над ним с помощью foreach .

foreach ($toppings as $topping) {
    echo $topping, "\n";
}

Глазурованный Шоколад с спринклерами Maple

Или беспорядок с любой из встроенных функций bazillion [].


Доступ к вложенные элементы

Свойства объектов и элементов массивов могут быть больше объектов и / или массивов - вы можете просто продолжать доступ к своим свойствам и членам как обычно, например $object->array[0]->etc.

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json);

echo $yummy->toppings[2]->id; //5004

Передача true в качестве второго аргумента в json_decode ()

Когда вы это сделаете, вместо объектов вы получите ассоциативные массивы - массивы со строками для ключей. Снова вы получаете доступ к их элементам, как обычно, например. $array['key'].

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json, true);

echo $yummy['toppings'][2]['type']; //Maple

Не знаю, как структурированы данные

Прочитайте документацию, независимо от того, получение JSON из.

Посмотрите на JSON - где вы видите фигурные скобки {}, ожидайте объект, где вы видите квадратные скобки [], ожидаете массив.

Нажмите декодированные данные с помощью

print_r() :

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json);

print_r($yummy);

и проверьте вывод:

stdClass Object
(
    [type] => donut
    [name] => Cake
    [toppings] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 5002
                    [type] => Glazed
                )

            [1] => stdClass Object
                (
                    [id] => 5006
                    [type] => Chocolate with Sprinkles
                )

            [2] => stdClass Object
                (
                    [id] => 5004
                    [type] => Maple
                )

        )

)

Он расскажет вам, где у вас есть объекты, где у вас есть массивы, а также имена и значения их членов.

Если вы можете только дойти до него до того, как потеряетесь, зайдите так далеко и нажмите , что с print_r():

print_r($yummy->toppings[0]);
stdClass Object
(
    [id] => 5002
    [type] => Glazed
)

Разбить проблему на части, которые легче обернуть вокруг головы.


json_decode() возвращает null

Это происходит потому, что либо:

  1. JSON полностью состоит именно из этого, null.
  2. JSON is недействителен - проверьте результат json_last_error_msg или введите его через JSONLi nt .
  3. Он содержит элементы, вложенные в глубину более 512 уровней. Эта максимальная глубина по умолчанию может быть переопределена путем передачи целого числа в качестве третьего аргумента в json_decode() .

Если вам нужно изменить максимальную глубину, вы, вероятно, решение неправильной проблемы. Узнайте, почему вы получаете такие глубоко вложенные данные (например, у службы, к которой вы обращаетесь, у которой возникает JSON, есть ошибка) и получить это, чтобы этого не произошло.


Имя свойства объекта содержит специальный символ

Иногда у вас будет имя свойства объекта, которое содержит нечто вроде дефиса - или знака @, которое не может использоваться в литеральном идентификаторе. Вместо этого вы можете использовать строковый литерал в фигурных скобках для его адресации.

$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);

echo $thing->{'@attributes'}->answer; //42

Если у вас есть свойство integer as: Как получить доступ к свойствам объекта с именами типа целых чисел? как ссылка.


Кто-то поставил JSON в ваш JSON

Это смешно, но это происходит - JSON закодирован как строка в вашем JSON. Декодирование, доступ к строке как обычно, декодирование , которое , и, в конечном счете, доступ к тому, что вам нужно.

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';

$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);

echo $toppings[0]->type; //Glazed

Данные не помещаются в память

Если ваш JSON слишком большой для json_decode(), чтобы обрабатывать сразу, все начинает становиться сложным. См. Также:


Как отсортировать его

См.: Ссылка: все основные способы сортировки массивов и данных в PHP .

11
задан Jens 12 April 2013 в 11:01
поделиться

5 ответов

Если вы выполняете его в скрипте, псевдоним будет завершен к завершению выполнения скрипта.

Если вы хотите, чтобы он был постоянным:

Ваш псевдоним четко определен, но вы должны сохранить его в ~/.bashrc, а не в сценарии оболочки.

Добавьте его в этот файл, а затем введите его с помощью . .bashrc - он будет загрузите файл, чтобы псевдоним можно было использовать.

Если вы хотите, чтобы он использовался только в текущем сеансе:

Просто напишите его в ваше консольное приглашение.

$ aa
The program 'aa' is currently not installed. ...
$ 
$ alias aa="echo hello"
$ 
$ aa
hello
$ 

Также: из ответа Кента мы можем видеть, что вы также можете source его на source your_file. В этом случае вам не нужно использовать shell script, это сделает обычный файл.

13
ответ дан Community 20 August 2018 в 18:30
поделиться
  • 1
    Я не хочу хранить его в .bashrc. Мне нужен этот псевдоним для работы только для текущего сеанса. – Narain 12 April 2013 в 10:48
  • 2
    Затем просто напишите в подсказке консоли. Если вы выполните его в скрипте, псевдоним будет завершен к завершению выполнения скрипта. – fedorqui 12 April 2013 в 10:49
  • 3
    Если мне приходится указывать 10 псевдонимов все время, может быть написано в консольном приглашении, потребуется много времени. Так или иначе, сценарий работал для меня. – Narain 12 April 2013 в 11:03
  • 4
    Да, source из ответа Кента это делает - я этого не знал. Мы можем получить от этого то, что вы можете даже иметь простой файл (не .sh) с сохраненным вашим псевдонимом, а затем использовать их, когда захотите использовать. – fedorqui 12 April 2013 в 11:09

введите свой сценарий, не выполняйте его как ./foo.sh или sh foo.sh

. Если вы выполняете свой скрипт так, он работает в суб-оболочке, а не в вашем текущем.

source foo.sh  

будет работать для вас.

31
ответ дан Kent 20 August 2018 в 18:30
поделиться
  • 1
    Проблема такого подхода заключается в том, что вся переменная скрипта будет вторгаться в вашу среду. который не то, что вы хотите! – AdrieanKhisbe 19 June 2015 в 18:23

sourcing скрипт source script.sh

./script.sh будет выполнен в суб-оболочке, и внесенные изменения применимы только к суб-оболочке. После того, как команда завершается, суб-оболочка переходит, а также выполняет изменения.


ИЛИ

HACK: просто выполните следующую команду на оболочке, а затем выполните скрипт.

alias xyz="cd /home/usr/src/xyz"
./script.sh

Чтобы использовать unalias в командной строке

unalias xyz 
2
ответ дан MangeshBiradar 20 August 2018 в 18:30
поделиться
  • 1
    И как выполнение alias xyz="cd /home/usr/src/xyz" добавляется к ~/.bashrc? – devnull 12 April 2013 в 10:59
  • 2
    извините, немного растерялся .. подтвердил ответ. – MangeshBiradar 12 April 2013 в 11:03
  • 3
    Извините, но для меня $alias, $unalias и $source не имеют смысла. Почему они являются переменными? Если вы не объясните это, я опустил голову. – erik 11 January 2014 в 08:12
  • 4
    $ используется только для представления приглашения в командной строке (как в некоторых из приведенных выше ответов). Кроме того, я не думаю, что SO поощряет пользователей к тому, чтобы сбивать с толку только потому, что они их не понимают. – user2251284 14 March 2016 в 00:29

Ваш псевдоним должен быть в вашем файле .profile не в вашем скрипте, если вы вызываете его в приглашении.

Если вы поместите псевдоним в свой скрипт, тогда вы должны называть его в своем скрипте .

Источник файла является правильным ответом при попытке запустить скрипт, внутри которого есть псевдоним.

source yourscript.sh
0
ответ дан Mogsdad 20 August 2018 в 18:30
поделиться

Для этого вам нужно установить конкретную опцию, expand_aliases:

 shopt -s expand_aliases

Пример:

# With option
$ cat a
#!/bin/bash
shopt -s expand_aliases
alias a="echo b"
type a
a
$ ./a
a is aliased to 'echo b'
b

# Without option
$ cat a
#!/bin/bash
alias a="echo b"
type a
a

$ ./a
./a: line 3: type: a: not found
./a: line 4: a: command not found

cf: https: // unix .stackexchange.com / a / 1498/27031 и https://askubuntu.com/a/98786/127746

13
ответ дан Community 20 August 2018 в 18:30
поделиться