Возможно, есть и другое наиболее быстрое решение. Этот код не учитывает наличие пробела в имени файла. Но вы можете попробовать следующий код:
SHW@SHW:/tmp # for i in `find /home/user -type f`
do
mv $i `echo $i | cut -c -13`.`$i | rev | cut -d'.' -f 1 | rev`
done
Вы смешиваете оболочку и создаете там
переменные. И , и
, и оболочка используют $
для своих переменных.
В Makefile переменными являются $ (var)
или $ v
для однобуквенных переменных и $ var
или $ {var}.
в снарядах.
Но если вы напишете $ var
в Makefile, make
поймет его как $ (v) ar
. Если вы хотите передать оболочке литерал $
, вам нужно ввести его как $$
, как в $$ var
или $$ {var}
, чтобы он стал $ var
или $ {var}
для оболочки.
Кроме того, make
запускает sh
, а не bash
, чтобы интерпретировать этот код ( Edit , извините, пропустил ваш SHELL: = / bin / bash
выше, обратите внимание, что во многих системах нет bash
в / bin
, если у них вообще есть bash
и : =
зависит от GNU), поэтому вам нужно использовать синтаксис sh
. echo -n
, read -s
- это синтаксис zsh
/ bash
, а не синтаксис sh
.
Лучше всего для этого добавить сценарий zsh
/ bash
(и добавить зависимость сборки от bash
). Что-то вроде:
#! /usr/bin/env bash
printf 'Welcome\nPlease enter the MySQL host (default: localhost): '
read host || exit
host=${host:-localhost}
printf "Please enter the MySQL username: "
read username || exit
printf "Please enter the MySQL password:"
IFS= read -rs password || exit
printf '\n'
mv includes/config.php.example includes/config.php 2>/dev/null
repl=${password//\\/\\\\}
repl=${repl//&/\\&}
repl=${repl//:/\\:}
{ rm includes/config.php &&
sed 's/"USER", ""/"USER", "'"$username"'"/g
s:"PASSWORD", "":"PASSWORD", "'"$repl"'"/g' > includes/config.php
} < includes/config.php || exit
mysql -u "$username" -p"$password" codeday-team < ./codeday-team.sql || exit
echo "Configuration complete. For further configuration options, check the config file"
Он решает еще несколько проблем:
-r
при чтении пароля, если вы хотите разрешить пользователю использовать обратную косую черту в своем пароле. IFS =
, если вы хотите разрешить пользователю иметь пароль, который начинается или заканчивается пробелами. ; true
после mv
не делает то, что вы думаете. Он не отменяет действие опции errexit
(для реализаций make
, которые вызывают оболочку с помощью -e
). Вместо этого вам понадобится || true
.Здесь мы не используем errexit
, а сами выполняем обработку ошибок с помощью || при необходимости выйдите из
. &
и разделителя s: pattern: repl:
(здесь :
), иначе это не сработает (и может имеют неприятные побочные эффекты). Вы не можете выполнить sed ... <файл> файл
, поскольку файл
будет усечен еще до запуска sed
. Некоторые реализации sed
поддерживают для этого параметр -i
или -i ''
. В качестве альтернативы вы можете использовать perl -pi
. Здесь мы выполняем аналог perl -pi
вручную (удаляем и воссоздаем входной файл после того, как он был открыт для чтения), но не заботясь о метаданных файла.
Здесь было бы лучше использовать пример один как входной, а последний как выходной.
Он по-прежнему не решает еще несколько проблем:
config.php
создается с разрешениями, полученными из текущей umask
, которая, вероятно, будет ] доступен для чтения и принадлежит пользователю, выполняющему make
. Возможно, вам потребуется адаптировать маску umask
и / или сменить владельца, если каталог включает
иным образом не ограничен, поскольку этот файл содержит конфиденциальную информацию. "
символов, это, скорее всего, сломается (на этот раз для php
).Вы бы хотели либо запретить их (возвращая ошибку), либо добавить еще один уровень экранирования для них в правильном синтаксисе для этого файла php
. У вас, вероятно, будут аналогичные проблемы с обратной косой чертой, и вы также можете исключить символы, отличные от ascii, или управляющие символы. Передача пароля в командной строке mysql
, как правило, является плохой идеей, поскольку это означает, что он отображается в выводе команды ps -f
. Было бы лучше использовать:
mysql --defaults-file = <(
printf '[client] \ nuser =% s \ npassword = "% s" \ n' "$ username" "$ пароль ") ...
printf
встроен,он не будет отображаться в выводе ps
.
переменная $ host
не используется.
вы не используете никаких функций Makefile, вы пытались написать эти строки в одной оболочке?
затем в Makefile, который вы используете
echo $username;\
echo $password;\
make проанализирует $ username
как $ u
(пустая переменная) + sername
(string)
попробуйте заменить $ username
на $$ username
, если вы хотите остаться в Makefile.