解析文件名的一部分以用作bash中的变量

时间:2015-03-13 14:33:35

标签: linux bash scripting

我需要获取数据库名称并将其用作文件名部分的变量。目前我从 ls 命令中提取文件名。这就是它的回报:
试验20150311-1200.sql

我需要文件名的第一部分到“ - ”,所以对于这个例子,它将是Test。我怎样才能获得变量的部分文件名?下面是我正在处理的完整脚本。任何帮助都会很棒。感谢。

#!/bin/bash
DB_USER=x
DB_PASS=x
DB=
        for DB_GZFILE in $( ls *.sql.gz ); do
        gunzip $DB_GZFILE
            echo item: $DB_FILE unzipped
    done
        for DB_FILE in $( ls *.sql ); do    
#Use this statement to insert dump into a new server
        mysql $DB <$DB_FILE
    done    
#Use this command to insert into a server already in use
#       mysql -u$DB_USER -p$DB_PASS <$DB_FILE
            echo $DB_FILE inserted into database
    done
#Remove sql files used to insert into this server

#            rm $DB_FILE
#           echo $DB_FILE removed
    done

            echo restarting the mysql process .....
#       /etc/init.d/mysql restart
             echo mysql restarted
       done

1 个答案:

答案 0 :(得分:3)

Don't parse ls

    for DB_GZFILE in *.sql.gz; do
    for DB_FILE in *.sql; do    

要获取第一部分,请使用parameter substitution删除第一个-以及所有后续字符:

first_part=${DB_FILE%%-*}

您应该引用所有"$vars",尤其是您从用户或文件系统获得的任何值:您永远不知道何时会获得带有空格的文件名。例如:

gunzip "$DB_GZFILE"

我建议你不要使用ALL_CAPS_VARNAMES:有一天你会accidentally use PATH=...,然后想知道为什么你的脚本坏了。保留ALL_CAPS以获取系统环境变量和shell特殊变量。