для цикла env с рисунком и вывода результата

Названия таблиц и столбцов не могут быть заменены параметрами в PDO.

В этом случае вы просто захотите фильтровать и дезинфицировать данные вручную. Один из способов сделать это - передать сокращенные параметры функции, которая будет выполнять запрос динамически, а затем использовать оператор switch() для создания белого списка допустимых значений, которые будут использоваться для имени таблицы или имени столбца. Таким образом, пользовательский ввод никогда не попадает непосредственно в запрос. Например:

function buildQuery( $get_var ) 
{
    switch($get_var)
    {
        case 1:
            $tbl = 'users';
            break;
    }

    $sql = "SELECT * FROM $tbl";
}

Не оставляя случая по умолчанию или используя случай по умолчанию, который возвращает сообщение об ошибке, вы убедитесь, что используются только значения, которые вы хотите использовать.

0
задан Amitābha 14 July 2018 в 00:37
поделиться

1 ответ

Если вы все еще застреваете, проблема, с которой вы используете подменю services=$(compgen -A variable | grep service), состоит в том, что она создает одну длинную строку, содержащую service1 service2 service3.... Хотя вы можете разобрать это с обычным расщеплением слов, вам лучше обслуживать сохранение требуемой переменной окружения в индексированном массиве, например

services=( $(compgen -A variable | grep 'service' | grep -v 'services') )

(grep -v 'services' в необходимости удаления services из список, который объявлен перед вызовом compgen)

Теперь вы можете просто перебрать ваш массив с использованием косвенности и переменной счетчика, чтобы создать выход serverX=val вы хотите, например,

declare -i n=1
for i in ${services[@]}; do
    printf "%s=%s\n" "server$((n++))" "${!i}"
done

Введя его в целом в коротком примере, вы можете сделать что-то вроде следующего:

#!/bin/bash

service1=1
service2=a
service3=dd

## fill services with all variable containing "service", excluding "services"
services=( $(compgen -A variable | grep 'service' | grep -v 'services') )

declare -i n=1
for i in ${services[@]}; do
    printf "%s=%s\n" "server$((n++))" "${!i}"  ## use indirection to get value of i
done

Пример использования / вывода

$ bash compgen_tst.sh
server1=1
server2=a
server3=dd

Посмотрите все и дайте мне знать, если у вас появятся дополнительные вопросы.

0
ответ дан David C. Rankin 17 August 2018 в 12:04
поделиться
  • 1
    Вы можете выполнить цикл непосредственно над "${!service@}". Не было бы необходимости ни для grep :), и флаг -i может только создать путаницу, на мой взгляд, в то время как преимущества довольно малы. – PesaThe 14 July 2018 в 07:14
  • 2
    Это хороший момент, я немного склонялся к косвенности, например ${!services[@]}'. You would still need a loop variable (or old $ 1` и shift), чтобы удерживать значения, но я вижу, как это может быть чище. – David C. Rankin 14 July 2018 в 09:08
Другие вопросы по тегам:

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