使用文件名的前3个字符作为shell脚本中的变量

时间:2015-02-09 11:35:38

标签: shell unix

这是我的第一篇文章,所以希望我能清楚地表达我的问题。

我是shell脚本的新手,我的任务是为csv文件的每一行添加一个新值。需要添加的值基于文件名的前3位数。

我有点背景。我收到的csv文件最终被加载到分区的oracle表中。文件名的开头(例如BATTESTFILE.txt)包含分区的站点,因此我需要编写一个脚本,该脚本采用文件名的前3个字符(在本例中为BAT)并将其添加到文件的每一行的末尾

我到目前为止最接近的是当我将代码剥离到我需要做的基本知识时:

build_files()                                          
{                                                      
    OLDFILE=${filename[@]}.txt                     
    NEWFILE=${filename[@]}.NEW.txt                 
    ABSOLUTE='path/scripts/'        
    FULLOLD=$ABSOLUTE$OLDFILE                      
    FULLNEW=$ABSOLUTE$NEWFILE                      
    sed -e s/$/",${j}"/ "${FULLOLD}" > "${FULLNEW}"
}                                                      

set -A site 'BAT'                                      
set -A filename 'BATTESTFILE'                          

for j in ${site[@]};  do                               

    for i in ${filename[@]}; do                    
            build_files ${j}                       
    done                                           

done   

我在这里设置了一个数组site,因为会有6个网站'这将使文件传递给我时,可以很容易地将代码添加到代码中。 filename数组也是如此。

此代码有效,但它并不像我需要的那样自动化。我最近的尝试之一是:

build_files()                                          
{                                                      
    OLDFILE=${filename[@]}.txt                     
    NEWFILE=${filename[@]}.NEW.txt                 
    ABSOLUTE='/app/dss/dsssis/sis/scripts/'        
    FULLOLD=$ABSOLUTE$OLDFILE                      
    FULLNEW=$ABSOLUTE$NEWFILE                      
    sed -e s/$/",${j}"/ "${FULLOLD}" > "${FULLNEW}"
}                                                      

set -A site 'BAT'                                      
set -A filename 'BATTESTFILE'                          

for j in ${site[@]};  do                               

    for i in ${filename[@]}; do                    
    trust=echo "$filename" | cut -c1-3             
    echo "$trust"                                  
    if ["$trust" = 'BAT']; then                    
    ${j} = 'BAT'                                   
    fi                                             
    build_files ${j}                               
    done                                           
done  

我在研究时通过StackOverflow上的另一个问题找到了代码trust=echo "$filename" | cut -c1-3,但它似乎并不适合我。我添加了echo来测试trust持有的内容,但它是空的。

我收到2个错误: 第17行 - BATTESTFILE:未找到 第19行 - 测试:]缺失

很抱歉这个冗长的问题。希望它包含有用的信息,并显示我采取的步骤。任何问题,评论。非常感谢任何帮助或指导。感谢。

3 个答案:

答案 0 :(得分:0)

当你是shell的新手时,请尝试避免使用数组 在if语句中,在[和]字符之前和之后使用空格。 习惯用{}之类的$ {trust}

来包围你的shell变量

我不知道你是如何填充数组的,当阵列被硬编码时,请尝试替换 SITE =文件1 SITE =" $ {SITE} file2"

你必须告诉unix你想让右边的东西与$(..)相比(优于背景):

trust=$(echo "${filename}" | cut -c1-3)

可以在Google

找到一些指南和语法帮助

答案 1 :(得分:0)

只需使用shell parameter expansion

$ var=abcdefg
$ echo "${var:0:3}"
abc

假设您正在使用像bash或ksh这样功能强大的shell,例如

答案 2 :(得分:0)

以防万一现在或将来对其他人都有用,我使用下面的代码让我的代码按照需要运行。感谢下面的Walter A回答我从文件名中获取前3个字符并将它们用作变量的主要问题。

这为我提供了获取文件名的前3个字符所需的输出,并将它们添加到我的csv文件中每行的末尾。

## Get the current Directory and file name, create a new file name
build_files()                                                                   
{                                                                               
    OLDFILE=${i}.txt                                                        
    NEWFILE=${i}.NEW.txt                                                    
    ABSOLUTE='/app/dss/dsssis/sis/scripts/'                                 
    FULLOLD=$ABSOLUTE$OLDFILE                                               
    FULLNEW=$ABSOLUTE$NEWFILE 

## Take the 3 characters from the filename and 
## add them onto the end of each line in the csv file.

    sed -e s/$/";${j}"/ "${FULLOLD}" > "${FULLNEW}"                         
}                                                                               

## Loop to take the first 3 characters from the file names held in
## an array to be added into the new file above  

set -A filename 'BATTESTFILE'                             

    for i in ${filename[@]}; do                                             
    trust=$(echo "${i}" | cut -c1-3)                                        
    echo "${trust}"                                                         
    j="${trust}"                                                            
    echo "${i} ${j}"                                                        
    build_files ${i} ${j}                                                   

done                                                                            

希望这对其他人有用。