Пожалуйста, смотрите ниже результаты, похоже, что первая строка не работает только для первого файла, но для остальных есть идеи?
#!/bin/sh
cpuser=$1
cd "/home/$cpuser/public_html"
wpconfigs=($(find . -name "wp-config.php"))
for i in "${wpconfigs[@]}";
do
cpuser=$cpuser
wpdb=$(grep -e "DB_NAME" $i | cut -d \' -f 4)
wpuser=$(grep -e "DB_USER" $i | cut -d \' -f 4)
wppass=$(grep -e "DB_PASS" $i | cut -d \' -f 4)
set -x uapi --output=jsonpretty --user = "$cpuser" Mysql create_user name = "${wpuser}" password = "${wppass}";
sleep 2s;
set -x uapi --output=jsonpretty --user = "$cpuser" Mysql set_privileges_on_database user = "${wpuser}" database = "${wpdb}" privileges = "ALL PRIVILEGES";
sleep 2s;
set -x uapi --output=jsonpretty --user = "$cpuser" Mysql set_password user = "${wpuser}" password = "${wppass}";
sleep 2s;
done
Когда я смотрю на набор выходных данных -x для отладки, я вижу следующее:
[root@cpanel201 ~]# sh ./testing.sh qv5goe35p3783sz8
+ sleep 2s
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql set_privileges_on_database 'user=qv5goe35p3783sz8_yscr_bbS$L5' database=qv5goe35p3783sz8_blog 'privileges=ALLPRIVILEGES'
+ sleep 2s
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql set_password 'user=qv5goe35p3783sz8_yscr_bbS$L5' password=FhtH6UztIuoS0_
+ sleep 2s
+ for i in "${wpconfigs[@]}"
+ cpuser=qv5goe35p3783sz8
++ grep -e DB_NAME ./wordpress/wp-config.php
++ cut -d \' -f 4
+ wpdb=qv5goe35p3783sz8_wordpress
++ grep -e DB_USER ./wordpress/wp-config.php
++ cut -d \' -f 4
+ wpuser=qv5goe35p3783sz8_yscr_bb5X8h
++ grep -e DB_PASS ./wordpress/wp-config.php
++ cut -d \' -f 4
+ wppass=X7lyC17Td8tH3cm
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql create_user name=qv5goe35p3783sz8_yscr_bb5X8h password=X7lyC17Td8tH3cm
+ sleep 2s
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql set_privileges_on_database user=qv5goe35p3783sz8_yscr_bb5X8h database=qv5goe35p3783sz8_wordpress 'privileges=ALL PRIVILEGES'
+ sleep 2s
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql set_password user=qv5goe35p3783sz8_yscr_bb5X8h password=X7lyC17Td8tH3cm
+ sleep 2s
+ for i in "${wpconfigs[@]}"
+ cpuser=qv5goe35p3783sz8
++ grep -e DB_NAME ./newsite/wp-config.php
++ cut -d \' -f 4
+ wpdb=qv5goe35p3783sz8_newsite
++ grep -e DB_USER ./newsite/wp-config.php
++ cut -d \' -f 4
+ wpuser=qv5goe35p3783sz8_yscr_bbxQiN
++ grep -e DB_PASS ./newsite/wp-config.php
++ cut -d \' -f 4
+ wppass=XpMa4v5z54tcM
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql create_user name=qv5goe35p3783sz8_yscr_bbxQiN password=XpMa4v5z54tcM
+ sleep 2s
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql set_privileges_on_database user=qv5goe35p3783sz8_yscr_bbxQiN database=qv5goe35p3783sz8_newsite 'privileges=ALL PRIVILEGES'
+ sleep 2s
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql set_password user=qv5goe35p3783sz8_yscr_bbxQiN password=XpMa4v5z54tcM
+ sleep 2s
Если вы посмотрите на выходные данные для второго + третьего набора файлов, вы увидите три команды uapi, однако для первого мы видим только две и никаких выходных данных с точки зрения greps, которые он выполняет в верхнем файле.
Для справки, cpuser задается в командной строке (значение после sh ./testing.sh)
Я также заметил, что в верхнем файле пользователь окружен , а два других - нет.
Для ясности, что здесь делает скрипт;
В этом экземпляре действие работает с конфигурационными файлами 2 и 3, но не с начальным - вы увидите, что первый create_user отсутствует даже на наборе -x
**
ОБНОВЛЯТЬ
Изучив журналы, я полагаю, что это может быть связано с тем, что у пользователя на первом есть $ внутри него - может быть поэтому? Я заметил, что только в этом случае команда заключена в кавычки, что неверно для uapi. Если это может быть почему, как мне это решить?
'пользователь=qv5goe35p3783sz8_yscr_bbS$L5'
Как мне избежать $, так как я думаю, что это вызывает проблему в этом случае - все остальные в порядке, только если $ находится в имени пользователя, эта проблема возникает
Дополнительные подробности добавлены @Jetchisel - -x был просто для меня, чтобы увидеть, что выталкивается
set -x используется неправильно. Либо используйте его один раз в начале программы, либо вызовите программу с помощью bash -x .... См. Как отладить скрипт Bash?.
Код запускается с sh (это может быть bash, но также может быть dash или что-то еще), но использует башизмы (массивы).
wpconfigs=($(find . -name "wp-config.php")) вообще не работает. Если вы запустите Shellcheck в коде, он укажет на проблему и даст ссылку на объяснения и варианты ее устранения.
Я считаю, что проблема связана с тем, что на самом деле у пользователя есть $, однако я не уверен, есть ли способ передать его без проблем. Остальная часть массива работает отлично, только этот с $ является именем пользователя
Поскольку использование $wpuser указано в кавычках, наличие $ в нем не должно быть проблемой. Вывод из set -x сбивает с толку. Он пытается быть полезным, помещая кавычки только там, где они были бы необходимы, если бы команда запускалась вручную. Кавычки не передаются uapi. Ваша проблема почти наверняка в другом.
Все точки с запятой в коде лишние. Они безвредны, но немного затрудняют чтение.
См. Подводные камни Bash #1 (для f в $(ls *.mp3)) для получения дополнительной информации о проблемах с $(find ...), в том числе о том, что с этим делать.
Убедитесь, что ни одна из строк не содержит CR с помощью dos2unix.
Проблема возникает только в первой строке for - я думаю, это потому, что первый wpconfig имеет $ в имени пользователя, поэтому он цитирует это конкретное for в 's, как мне избежать их, когда он печатает переменную?
Также Как прочитать файл (поток данных, переменную) построчно (и/или по полю)?
Опять же, символы ' вокруг имени пользователя являются артефактом set -x. Чтобы увидеть, что на самом деле видит uapi, временно поставьте echo перед ним (echo uapi --output=...) и запустите код.
Я не знаю, что делает uapi, но я предполагаю, что в этом случае он выполняет внутренние команды MySQL. Если это так, я также предполагаю, что это может вызвать дополнительное расширение оболочки для аргументов. Это потребует включения кавычек в переданные ему строки. Чтобы надежно добавить кавычки к содержимому wpuser, запустите printf -v wpuser '%q' "$wpuser".
Смотрите также Разница между sh и bash
Обратите внимание, что с текущим кодом в вопросе uapi никогда не запускается. set -x uapi --output=jsonpretty ... включает трассировку (или оставляет ее включенной, если она уже включена), а затем назначает uapi позиционному параметру 1 ($1), назначает --output=jsonpretty позиционному параметру 2 ($2) и так далее.
Если вы исправите известные проблемы с кодом (плохие #!, set -x uapi ..., ошибки Shellcheck, ...) и запустите его, какие именно ошибки вы увидите? Единственные ошибки, которые я видел, это остатки (неправильного) использования set -x.





Следующий код говорит обо всем:
$ set -x ls
$ ls
+ ls
a.out
Насколько я знаю, во всех оболочках «ls» после «set -x» игнорируется. По следующим '$ ls' и '+ ls' видно, что выполняется 'set -x'.
Обычный способ сделать это и, возможно, то, что вы хотите, это:
$ set -x
$ ls
+ ls
a.out
$ set -
+ set -
Или как один лайнер:
$ set -x ; ls ; set -
+ ls
a.out
+ set -
По предыдущему вы также можете понять, почему строка отсутствует в вашем выводе «set -x» просто включает трассировку оболочки для следующей команды, где «set -» завершает ее также для следующей команды.
С set -x lsls не игнорируется. Позиционный параметр 1 ($1) становится ls.
Привет, Декерсер, если я вообще запускаю без set -x, ошибка в журналах показывает, что $ из пароля переносится как новая переменная и продолжается через сценарий, добавляющий случайные `до и после вещей.
Первое замечание, конечно, правильное $1 становится 'ls'. Теперь все сводится к тому, что вы делаете со своим сценарием. Но ваш «set -x uapi...» просто устанавливает позиционные параметры оболочки, поэтому ничего не делает. Таким образом, перезапись позиционных параметров несколько раз не имеет смысла, за исключением, возможно, неправильно понятой информации трассировки. Отсюда мой ответ выше.
Транспонирование '$L5' в пользователя является нормальным поведением оболочки при оценке значения. Найти, где это происходит, может быть непросто. Общий escape заключается в замене '$' в значении de на '\$'. Используйте '${cpuser//\$/\\$}' как лекарство. Но такой код всегда опасен, так как нужно экранировать больше символов оболочки... Чтобы увидеть, что происходит, используйте 'eval echo $cpuser' и 'eval echo ${cpuser//\$/\\$}'
Поставьте действительный shebang и вставьте свой скрипт на shellcheck.net для проверки/рекомендации. Кроме того, простой ввод и желаемый результат помогут другим понять, какова реальная цель.