"$(cmd)"
форма, рекомендуемая Chris, является самой безопасной, но это легче ввести и будет обычно работать точно также:
$ cd `dirname ~/home/blah/file.zip`
Различие - то, что форма обратных галочек может быть перепутана определенными символами в команде, которую она разворачивает. Для простой команды как та Вы показываете, можно сразу сказать, что это не будет проблемой. Для сценария оболочки, который должен принять произвольные аргументы, более безопасно использовать дважды заключенный в кавычки $()
форма.
Вот быстрая попытка:
for i in `find -type f -path "./src*" -name "*.php"`; do echo phpunit-skelgen.phar --test -- `echo $i | sed -e 's!./src/!!' | sed -e 's/.php//' | sed -e 's/\\//\\\/g'` $i `echo $i | sed -e 's!./src/!./test/!' | sed -e 's/.php/Test.php/'`;done
Учитывая следующую структуру каталогов:
./src/Superuseradmin/Model/Mapper/MyMapper.php
./src/Superuseradmin/Model/UUID.php
Это должно произвести:
phpunit-skelgen.phar --test -- Superuseradmin\Model\Mapper\MyMapper ./src/Superuseradmin/Model/Mapper/MyMapper.php ./test/Superuseradmin/Model/Mapper/MyMapperTest.php
phpunit-skelgen.phar --test -- Superuseradmin\Model\UUID ./src/Superuseradmin/Model/UUID.php ./test/Superuseradmin/Model/UUIDTest.php
Можно затем сохранить это к сценарию, проверить его и работать. Не упустите пробелы в именах файлов. Они доставят неприятности.
Вероятно, Вы хотите сделать что-то вроде этого:
cd src
for i in $(find . -type f -name '*.php'); do
SRC=$i
DST="../test/$(dirname $i)/$(basename $i php)Test.php"
echo "copy $SRC to $DST"
#cp $SRC $DST
done
for i in ...; SRC=$i
вместо for SRC in...
? Используя соединение двух переменных с тем же содержанием впоследствии...?
– Hauke Laging
31.05.2013, 14:30
Вы создаете сценарий оболочки:
#! /bin/bash
find_path="./src/Superuseradmin/Model/Mapper/UUID.php"
# find_path="$1"
class="${find_path#./src/}" # Superuseradmin/Model/Mapper/UUID.php
class="${class%.php}" # Superuseradmin/Model/Mapper/UUID
class="${class//\//\\}" # Superuseradmin\Model\Mapper\UUID
classhead="${class%\\*}" # Superuseradmin\Model\Mapper
classtail="${class#"$classhead"}" # \UUID
class="${classhead}${classtail}" # Superuseradmin\Model\Mapper\UUID
# echo "class: '${class}'"
testfile="./test${find_path#./src}"
testfile="${testfile%.php}Test.php"
# echo "testfile: '${testfile}'"
echo phpunit-skelgen.phar --test -- "$class" "$find_path" "$testfile"
И сделайте find
назовите этот сценарий:
find -type f -path "./src*" -name "*.php" -exec /my/script.sh {} \;
sed
экземпляры сразу друг после друга вместо того, чтобы использовать тогоsed
экземпляр с несколькими-e
параметры? Кроме того, одна такая строка является кошмаром понимания. Вычислите значения, присвойте их переменным, командам выполнения с переменными (вместо вычислительных выражений). – Hauke Laging 31.05.2013, 14:28for i in `find -type f -path "./src*" -name "*.php"`; do mkdir -p `dirname $(echo $i | sed -e 's!./src/\([[:alnum:]]*\)!./test/\1Test!')`; phpunit-skelgen.phar --bootstrap test/Bootstrap.php --test -- `echo $i | sed -e 's!./src/!!' -e 's/.php//' -e 's!\/!\\\\!g'` $i `echo $i | sed -e 's/.php/Test/' -e 's!./src/\([[:alnum:]]*\)!\1Test!' -e 's!\/!\\\\!g'` `echo $i | sed -e 's!./src/\([[:alnum:]]*\)!./test/\1Test!' -e 's/.php/Test.php/'`;done
– Gabriel Baker 31.05.2013, 20:29