修改现有代码以在交互式shell脚本中创建菜单名称

时间:2013-06-25 12:43:07

标签: bash shell awk

当我发出命令awk NR==7 ABC.mod时,它给了我需要的标题('添加'),该标题出现在文件的第7行当前我只能阅读标题,但我不知道如何将其附加到输出。有人可以帮我组织这个,所以我可以修改代码以获得预期的菜单输出,同时对现有脚本的干扰最小(我希望)吗?

1 个答案:

答案 0 :(得分:1)

假设您可以从每个*.mod文件的第7行中提取“添加”,“删除”...和其他“标题”,那么您需要修改脚本查看文件的位置在{em>似乎创建菜单的行之前的某个地方a1.out,即:tr ' ' '\n' < ~/a1.out > ~/b.dat

我说“假设”因为,即使您提到awk NR==7,我也看不到您在脚本中使用它的位置。在任何情况下,如果你可以从给定*.mod文件的第7行获得“标题”,那么你可以从文件名中获取菜单“name”(这似乎是你构建你的方式)菜单)像这样:

awk '{ln=length(ARGV[1]); if(NR==7) print substr(ARGV[1],0,ln-4)"..."$0}' ABC.mod

输出:

ABC...Add

使用sed可能有一种更简单,更简单的方法,但您提到了awk

至少对我而言,还没有足够的信息继续帮助你。如果你更新你的问题,有人可能会提出更具体的建议。

修改
我会在这里发布我的作品,希望你发现它很有用。这不是一个完整的解决方案。我不得不说,这是一个奇怪的编写应用程序 - shell代码和变量硬连线到临时数据到遍布文件系统的位置。尝试设置本地版本试用它有点毛茸茸。希望通过对鳕鱼进行实验和修改,您将了解有关应用程序如何工作以及一般shell编程的更多信息。额外建议:记录您的更改;勾画出应用程序读取和写入数据的方式/位置;在源代码中使用注释来帮助您和其他人记住代码的工作原理;备份;使用源代码控制。

我的假设:

pradee.sh看起来像这样(为什么文件的扩展名为.sh - 它似乎更像是为你的脚本定义了一些常量)

% cat pradee.sh 
HBKTM 
ABC 
HBKTM 
CBC 
HBKTM 
DBC
HBKTM 
IBC
HBKTM 
MBCE
HBKTM 
UBC
HBKTM
VBCM

以下是我创建“测试环境”的方法:

% for file in `grep -v HBKTM pradee.sh`; do touch $file.mod ; done
% ls
ABC.mod   CBC.mod   DBC.mod   IBC.mod   MBCE.mod  UBC.mod   VBCM.mod  pradee.sh    
% echo -e "_ctrl.jsp \n\n\n\n\n" > *.mod # mod files have required text+6 lines 
% echo -e "_ctrl.jsp \n\n\n\n\n" > HBKTM.mod  # this file seems special ?
% sed -i'' -e "7i\\[Ctrl-V Ctrl-J]
 Add" ABC.mod

OR since the files now have 6 lines ... echo the menu title onto the last line:

% echo "Delete" >> DBC.mod
% echo "Insert" >> IBC.mod
 ... [continue inserting titles like "Add" "Delete" etc to the other *.mod files]

之后我我有模仿你设置的数据文件。你告诉我。现在,如果我对您的脚本进行一些小的更改(因此文件位置不会删除覆盖我自己的文件)并添加我之前提到的awk命令,这就是我最终的结果:

# menu_create.sh                                                                                                                                           
# See http://stackoverflow.com/questions/17297671                           

rm -f *.dat                                                                     
clear                                                                           
cont="y"   

while [ "$cont" = "y" ] # "$" is need for POSIX                                 
do                                                                              
  echo -e "\n\nPlease Enter ONS Name : "                                        
  read ons                                                                      
  currpath=.                                                                    
  up=$(echo $ons|tr '[:lower:]' '[:upper:]')                                    
  #echo "\n ONS menu name \n"                                                   
  #echo $up                                                                     
  if [ -f $up.mod ]; then                                                       
    #in=$(grep -ri $up pradee.sh) # changed to following                        
    # - how could this have worked ?                                                                            
    in=$(grep -v $up pradee.sh)                                               
    if [ -n "$in" ]; then                                                       
        onsname=$(grep -ri "_ctrl.jsp" $up.mod)                                 
        #echo "onsname : $onsname"                                              
            if [ -n "$onsname" ]; then                                          
              echo -e "\n ONS menu name : $up "                           
              echo $in > a1.dat                                               
              #echo "written to a1.dat\n"                                 
              #cat ~/a1.dat                                                   
              #tr ' ' '\n' < ~/a1.dat > ~/a.dat                               
              #cat ~/a.dat                                                    
              sed "s/$up//g" a1.dat >a1.out                                   
              for i in `cat  a1.dat`; 
              do 
              awk '{ln=length(ARGV[1]);if(NR==7) print substr(ARGV[1],0,ln-4)"..."$0}' $i.mod >> menu.dat ; 
              done
                echo -e "\n FINUX Names \n"                                     
                #tr ' ' '\n' < a1.out > b.dat                                   
                tr ' ' '\n' < menu.dat > b.dat                                  
                cat b.dat                                                       
            else                                                            
                echo -e "ONS Name Not Valid !"                              
              fi                                                            
    else                                                                    
        echo -e "FINUX menu Name not found in our Repository"               
    fi                                                                      
  else                                                                      
    echo -e "\n Please Enter valid ONS name !!"                             
  fi                                                                        
  echo -e "\n\n Press "y" to continue, Any other key to exit"               
  read cont                                                                 
done                                         

它给了我这个输出:

Please Enter ONS Name : 
hbktm

 ONS menu name : HBKTM 

 FINUX Names 

ABC...Add
CBC...Cancel
DBC...Delete
IBC...Insert
MBCE...Modify
UBC...Undelete
VBCM...Verify


 Press y to continue, Any other key to exit
q

我希望我对您的问题的回复可以帮助您了解有关如何修改应用程序的更多信息。