как передать glob-строку в ffmpeg из функции bash? [Дубликат]

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

Вы определяете строку, используя одинарные кавычки, и PHP не анализирует строки с разделителями одиночной кавычки. Чтобы получить переменную интерполяцию, вам нужно использовать двойные кавычки или конкатенацию строк (или их комбинацию). См. http://php.net/manual/en/language.types.string.php для получения дополнительной информации.

Также вы должны проверить, что mysql_query вернул действительный ресурс результата, иначе fetch_ *, num_rows и т. д. не будут работать с результатом, поскольку это не результат! IE:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

if( $result === FALSE ) {
   trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR);
} else {
   while( $row = mysql_fetch_array($result) ) {
      echo $row['username'];
   }
}

http://us.php.net/manual/en/function.mysql-query.php для получения дополнительной информации.

0
задан Charles Duffy 30 December 2015 в 04:04
поделиться

1 ответ

Адресация «почему»

Присвоения, как и в var=foo*, не расширяют globs - то есть, когда вы запускаете var=foo*, буквальная строка foo* помещается в переменная foo, а не список файлов, соответствующих foo*.

Напротив, некорректное использование foo* в командной строке расширяет глобус, заменяя его списком отдельных имен, , каждый из которых передается как отдельный аргумент .

Таким образом, запуск ./yourscript foo* не проходит foo* как $1, если нет файлов, соответствующих этому выражению glob; вместо этого он становится чем-то вроде ./yourscript foo01 foo02 foo03, причем каждый аргумент находится в другом месте в командной строке.

Причина, по которой работает ./yourscript "foo*", является обходным путем - это неупомянутое расширение внутри скрипта, позволяющее glob в дальнейшем. Однако это плохая практика: расширение glob происходит параллельно с расщеплением строк (это означает, что использование этого поведения устраняет вашу способность передавать имена файлов, содержащие символы, найденные в IFS, обычно пробелы), а также означает, что вы не можете передавать литералы имена файлов, когда они также могут быть интерпретированы как глобы (если у вас есть файл с именем [1] и файл с именем 1, передача [1] всегда будет заменена на 1).


Idiomatic Usage

Идиоматический способ построения этого будет состоять в том, чтобы shift отпустить первый аргумент, а затем перебрать последующие, например:

#!/bin/bash
out_base=$1; shift

shopt -s nullglob                 # avoid generating an error if a directory has no .status

for dir; do                       # iterate over directories passed in $2, $3, etc
  for file in "$dir"/*.status; do # iterate over files ending in .status within those
      grep -e "string" "$file"    # match a single file
  done
done >"${out_base}.extension"

Если у вас много файлов .status в одном каталоге, все это можно сделать более эффективным, используя find для вызова grep с максимально возможным количеством аргументов, а не для вызова grep отдельно для каждого файла :

#!/bin/bash
out_base=$1; shift

find "$@" -maxdepth 1 -type f -name '*.status' \
  -exec grep -h -- /dev/null '{}' + \
  >"${out_base}.extension"

Оба сценария выше предполагают, что глобы не передавались в вызывающую оболочку. Таким образом, использование имеет форму:

# being unquoted, this expands the glob into a series of separate arguments
your_script descriptor dir_*_map

Это значительно лучше, чем передача globs в ваш скрипт (который затем должен расширять их для получения фактических файлов для использования); он корректно работает с именами, содержащими пробелы (которые другая практика не делает), и файлы, имена которых сами являются глобус-выражениями.


Некоторые другие примечания:

  • Всегда добавляйте двойные кавычки вокруг разложений! В противном случае это приведет к дополнительным шагам расширения строки и расширения glob (в указанном порядке). Если вы хотите globbing, как в случае "$dir"/*.status, то завершите кавычки до начала выражения glob.
  • for dir; do точно эквивалентен for dir in "$@"; do, который итерации по аргументам. Не делайте ошибку, используя вместо этого for dir in $*; do или for dir in $@; do! Эти последние вызовы объединяют каждый элемент списка с первым символом IFS (который по умолчанию содержит пространство, вкладку и новую строку в этом порядке), затем разбивает результирующую строку на любые IFS символы, найденные внутри , затем расширяет каждый компонент результирующего списка в виде глоба.
  • Передача /dev/null в качестве аргумента в grep является мерой безопасности: она гарантирует, что у вас нет другого поведения между одно- аргумент и аргументы с несколькими аргументами (в качестве примера, grep по умолчанию используется для печати имен файлов в выходном файле только при передаче нескольких аргументов) и гарантирует, что вы не можете grep зависать, пытаясь читать из stdin, если он не передал никаких дополнительных имен файлов (f36] здесь не будет, но xargs может).
  • Использование имен нижнего регистра для ваших собственных переменных (в отличие от переменных в системе и оболочке, которые имеют имена всех прописных букв) соответствует соглашению, указанному в POSIX; см. четвертый абзац спецификации POSIX относительно переменных среды , имея в виду, что переменные среды и переменные оболочки совместно используют пространство имен.
4
ответ дан Charles Duffy 25 August 2018 в 20:06
поделиться
Другие вопросы по тегам:

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