Как разбить строку в сценарии оболочки - PullRequest
3 голосов
/ 13 октября 2010

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

username_databasename

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

/backups/username/backup

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

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

/backups/others/backup

Ответы [ 7 ]

4 голосов
/ 13 октября 2010

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

username=others
if echo $name | grep '_'; then
 username=$(echo $name | cut -d'_' -f 1)
fi
3 голосов
/ 13 октября 2010

У Джонатана Леффлера хороший, чистый ответ.

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

username="${fullname%_*}"

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

3 голосов
/ 13 октября 2010

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

case $fullname in
(*_*) username=$(echo $fullname | sed 's/_.*//');;
(*)   username=others;;
esac
backupdir="/backups/$username/backup"
2 голосов
/ 13 октября 2010

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

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)
1 голос
/ 13 октября 2010

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

db_name=username_databasename

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

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

0 голосов
/ 13 октября 2010

Для решения 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 оператор определяет, есть ли подчеркивание, проверяя измененную строку по отношению к оригиналу.Если есть подчеркивание, они будут другими.

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


(немного) более простой вариант будет:

export bkpdir=/backups/others/backup
if [[ "${x%%_*}" != "${x}" ]]; then
    export bkpdir=/backups/${x%%_*}/backup
fi
0 голосов
/ 13 октября 2010

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

username = `echo $name | awk -F"_" '{print $1}'`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...