Добрый день хабраюди.
Столкнулся с такой проблеемой — необходимо из строки, например, "/etc/somewhere" выделять в другую перенменную первое слово с конца (до слеша).
Как такое реализовать на bash?
Если же идёт поток из файла, то sed, awk. Можно и в цикле while read LINE, но это неэффективно (sed с awk'ом вместе взятые успеют по 5-10 раз каждый отработать =) )
#!/usr/bin/env bash
DATABASES='/var/www /etc/ssh'
backup_files()
{
db="${1}"
FNAME="$(${db} | sed 's|.*/||')"
echo $FNAME >> test
}
# Backup.
echo "* Backing up databases ..."
for db in ${DATABASES}; do
backup_files ${db} >> test
done
#!/usr/bin/env bash
DATABASES='/var/www /etc/ssh'
backup_files()
{
db="${1}"
FNAME="${db##*/}"
echo $FNAME >> test
}
# Backup.
echo "* Backing up databases ..."
for db in ${DATABASES}; do
backup_files ${db} >> test
done
smartlight не работает, потому что происходит следующее:
FNAME="$(${db} | sed 's|.*/||')"
вместо ${db} подставляется значение переменной и распознаётся шеллом как команда. Он ей пытается выполнить и передать выхлоп sed'у. Вероятнее всего такой команды он не находит и вылетает с ошибкой, а переменная FNAME остаётся пустой.
Чтобы работало как в ответе Ramires'a, вам необходимо поставить echo перед ${db}. Тогда сама ${db} будет передаваться через пайп sed'у, и последний её успешно обработает.
Но лучше прислушаться к ответу Portfel'я и моему.
sed в данном случае лишняя сущность.