2010-10-13 2 views
3

У меня есть имя базы данных в следующем форматеКак разбить строку в скрипте

username_databasename 

Теперь я хочу, чтобы поместить отдельные резервные копии базы данных в директории имени пользователя как

/backups/username/backup 

Как я могу получить usernamae из этой строки

Я также хочу, чтобы, если строка не содержит подчеркивания (_), то резервная копия должна перейти в

/backups/others/backup 

ответ

4

Вы можете сделать:

username=others 
if echo $name | grep '_'; then 
username=$(echo $name | cut -d'_' -f 1) 
fi 
+1

спасибо за это. Я также хочу, чтобы if (_) не присутствовал, тогда по умолчанию username = others – 2010-10-13 06:35:22

3

Вы можете использовать вариацию:

case $fullname in 
(*_*) username=$(echo $fullname | sed 's/_.*//');; 
(*) username=others;; 
esac 
backupdir="/backups/$username/backup" 
3

Джонатан Леффлера имеет приятный, чистый ответ.

Если вы не хотите использовать СЭД по какой-то причине, вы можете заменить $(echo | sed) бит с:

username="${fullname%_*}" 

, который делает то же самое.

0

вы можете использовать AWK:

username = `echo $name | awk -F"_" '{print $1}'` 
1

Нет необходимости cut, grep, sed или awk здесь. Просто используйте встроенную подстановку параметров bash «s:

db_name=username_databasename 

username=others 
if [[ ${db_name} =~ '_' ]]; then 
    username=${db_name%%_*} 
fi 
backup_dir=/backups/${username}/backup 

Я предпочитаю придерживаться только один язык для одного сценария, с наименьшим количеством вилок, как это возможно :-)

0

bash Для -Только раствора не потенциально дорогостоящим вызовы внешних программ (только важно, если вы делаете это много, что не может быть в данном случае):

pax> export x=a ; if [[ "${x%%_*}" != "${x}" ]]; then 
...> export bkpdir=/backups/${x%%_*}/backup 
...> else 
...> export bkpdir=/backups/others/backup 
...> fi 
pax> echo "  ${bkpdir}" 
    /backups/others/backup 

pax> export x=a_b ; if [[ "${x%%_*}" != "${x}" ]]; then 
...> export bkpdir=/backups/${x%%_*}/backup 
...> else 
...> export bkpdir=/backups/others/backup 
...> fi 
pax> echo "  ${bkpdir}" 
    /backups/a/backup 

if оператор определяет, если есть подчеркивание, проверяя модифицированную строку против Ori ginal. Если будет знак подчеркивания, они будут разными.

${x%%_*} дает вам строку вплоть до удаления самого длинного шаблона _* (другими словами, он удаляет все, начиная с первого подчеркивания и заканчивая).


А (немного) проще был бы вариант:

export bkpdir=/backups/others/backup 
if [[ "${x%%_*}" != "${x}" ]]; then 
    export bkpdir=/backups/${x%%_*}/backup 
fi 
+0

В каком виде это только bash? Операция '%%' определена в POSIX. Кроме того, вам не нужно «экспортировать» всюду. На самом деле, я не понимаю, почему вы хотите поместить его вообще, так как вы не делаете никаких внешних вызовов программ. –

+0

Я имел в виду bash-only, так как без внешних вызовов grep или sed. Я не имел в виду, что это будет работать только в bash. И я обычно использую экспорт, где есть сомнения, потому что есть несколько вещей, более раздражающих, чем попытка выяснить, почему запущенный процесс не может видеть переменную окружения. Мое использование экспорта не имеет ничего общего с моим ответом, но это простой код поддержки, который дает полный рабочий образец. – paxdiablo

+0

ха-ха, я думаю, мне нужно узнать так много вещей, чтобы понять ур ответ. Не могли бы вы дать мне некоторый учебник, чтобы понять экспорт, %% thing.i также не знаю много seb, awk. любые tutts, которые могут заставить меня написать программу, например, u. Хотя я получил свой ответ в простых шагах, но мне нравится, как это можно сделать. – 2010-10-13 12:24:25

2

В Баш, вы можете использовать массивы, например, так:

str="a/bc/def" 
IFS="/" arr=($str) 
echo ${arr[0]}; # prints 'a' 
echo ${arr[1]}; # prints 'bc' 
echo ${arr[2]}; # prints 'def' 

echo ${arr[@]}; # prints 'a bc def' 

Если вы хотите разделить строку по другой «разделитель», просто измените линию IFS = «/» на этот разделитель, например

str="a,bc,def" 
IFS="," arr=($str) 
Смежные вопросы