$ cat test-paths.txt
test/sub2/configuration.php
test/sub3/configuration.php
test/configuration.php
test/sub1/configuration.php
$ cat find-host-test
#!/bin/bash
for i in `cat test-paths.txt`
do
echo $i
grep "public \$host = '127.0.0.1';" $i
#echo $?
if [ $? -eq 0 ]
then
echo "there's config file"
sed $i 's/$host = 127.0.0.1/$host = localhost/'
echo "changed to"
grep "public \$host =" $i
fi
done
выполнение find-host-test
привело к
$ bash find-host-test
test/sub2/configuration.php
public $host = '127.0.0.1';
there's config file
sed: can't find label for jump to `est/sub2/configuration.php'
changed to
public $host = '127.0.0.1';
test/sub3/configuration.php
test/configuration.php
public $host = '127.0.0.1';
there's config file
sed: can't find label for jump to `est/configuration.php'
changed to
public $host = '127.0.0.1';
test/sub1/configuration.php
public $host = '127.0.0.1';
there's config file
sed: can't find label for jump to `est/sub1/configuration.php'
changed to
public $host = '127.0.0.1';
Почему исчезла буква «t» тестовой папки?
Ваш sed
вызов является неправильным.
sed 's/$host = 127.0.0.1/$host = localhost/' "$i"
См. страницу руководства sed
:
sed [OPTION]... {script-only-if-no-other-script} [input-file]
inputfile является последним аргументом, не hte сначала.
заметка на полях Interessting : t
в sed
назван маркировкой. После t
название маркировки следует. В Вашем случае это - входное имя файла без продвижения t
. sed
поэтому попытки перейти к маркировке, названной est/sub2/configuration.php
, который sed
не может найти нигде. Второе выражение s///g
никогда не выполняется.
Причина, почему Ваш sed
не работает был уже дан хорошим ответом хаоса.
Позвольте мне пойти немного шага вперед для указания на другой способ циклично выполниться через файл, так как Вы используете некоторые ненужные шаги:
while IFS= read -r file
do
echo "$file"
if grep -q "public \$host = '127.0.0.1';" "$file"; then
echo "there's config file"
sed 's/$host = 127.0.0.1/$host = localhost/' "$file"
echo "changed to"
grep "public \$host =" "$file"
fi
done < "test-paths.txt"
Различия:
Вы используете for i in $(cat test-paths.txt)
(хорошо, с обратными галочками, но я не знаю, как заключить им в кавычки). Это в порядке, но лучше использовать красивое while
выполнение цикла while read line; do ... done < file
. Таким образом, Вы читаете одну строку за один раз. Посмотрите более широкую дискуссию о теме в считать строки, а не слова, канал/перенаправление к, 'в то время как считано' цикл.
Кроме того, использование обратных галочек удерживается от использования. Лучше использовать $()
, так как возможно вложить их. (На самом деле мы уже заметили, что это даже плохо при регистрации ответа здесь :))
Нет никакой потребности к grep "something"
и затем проверьте $?
состояние. Можно непосредственно использовать grep -q
для этого.
Некоторые из этих предложений могут быть также найдены путем вставки сценария в http://www.shellcheck.net/.