如何在shell脚本中打破字符串

时间:2010-10-13 06:26:00

标签: linux shell

我有以下格式的数据库名称

username_databasename

现在我想在用户名目录中添加单独的数据库备份,如

/backups/username/backup

如何从该字符串中获取用户名

我还想要,如果字符串不包含下划线(_),那么备份应该转到

/backups/others/backup

7 个答案:

答案 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)

此处无需cutgrepsedawk。只需使用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