我以以下格式拥有数据库名称
username_databasename
现在我想把单独的数据库备份放在用户名目录中,例如:
/backups/username/backup
如何从该字符串中获取用户名
如果字符串不包含下划线(_),则备用应转到
/backups/others/backup
您可以做:
username=others
if echo $name | grep '_'; then
username=$(echo $name | cut -d'_' -f 1)
fi
Jonathan Leffler提供了一个简洁明了的答案。
如果出于某些原因您不想使用sed,可以将$(echo | sed)
替换为:
username="${fullname%_*}"
它执行相同的操作。
您可以使用以下变体:
case $fullname in
(*_*) username=$(echo $fullname | sed 's/_.*//');;
(*) username=others;;
esac
backupdir="/backups/$username/backup"
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)
这里不需要使用cut
、grep
、sed
或awk
。只需使用bash
的内置参数替换:
db_name=username_databasename
username=others
if [[ ${db_name} =~ '_' ]]; then
username=${db_name%%_*}
fi
backup_dir=/backups/${username}/backup
我更喜欢每个脚本只使用一种语言,并尽可能少地分叉 :-)
你可以使用 awk:
username = `echo $name | awk -F"_" '{print $1}'`
如果你只想使用 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
%%
操作在POSIX中已定义。此外,您不需要在每个地方都加上“export”。实际上,我不明白为什么您要加上它,因为您没有进行任何外部程序调用。 - Roman Cheplyaka%%
是bash的东西,最好购买OReilly bash书籍:http://oreilly.com/catalog/9780596009656,他们还有一本名为“sed & awk”的适度好的书。或者,您也可以像我一样在IT行业工作30年 :-) - paxdiablo