我有以下格式的数据库名称
username_databasename
现在我想在用户名目录中添加单独的数据库备份,如
/backups/username/backup
如何从该字符串中获取用户名
我还想要,如果字符串不包含下划线(_),那么备份应该转到
/backups/others/backup
答案 0 :(得分:4)
你可以这样做:
username=others
if echo $name | grep '_'; then
username=$(echo $name | cut -d'_' -f 1)
fi
答案 1 :(得分:3)
您可以使用以下变体:
case $fullname in
(*_*) username=$(echo $fullname | sed 's/_.*//');;
(*) username=others;;
esac
backupdir="/backups/$username/backup"
答案 2 :(得分:3)
Jonathan Leffler有一个很好,干净的答案。
如果您出于某种原因不想使用sed,可以将$(echo | sed)
位替换为:
username="${fullname%_*}"
做同样的事情。
答案 3 :(得分:2)
在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)
答案 4 :(得分:1)
此处无需cut
,grep
,sed
或awk
。只需使用bash
的内置参数替换:
db_name=username_databasename
username=others
if [[ ${db_name} =~ '_' ]]; then
username=${db_name%%_*}
fi
backup_dir=/backups/${username}/backup
我更喜欢每个脚本只使用一种语言,尽可能少的叉子: - )
答案 5 :(得分:0)
你可以使用awk:
username = `echo $name | awk -F"_" '{print $1}'`
答案 6 :(得分: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
语句通过检查原始的修改后的字符串来检测是否有下划线。如果有下划线,它们会有所不同。
${x%%_*}
为您提供了删除最长_*
模式的字符串(换句话说,它会删除从第一个下划线到结尾的所有内容)。
(略微)更简单的变体是:
export bkpdir=/backups/others/backup
if [[ "${x%%_*}" != "${x}" ]]; then
export bkpdir=/backups/${x%%_*}/backup
fi