weixin_32849743 2022-05-11 16:13 采纳率: 50%
浏览 186
已结题

shell脚本不报错,但是脚本里的某一个while循环并不执行

最近写了一个可以格式化输出表格的shell脚本,根据扫描出目录的owner,进而加入一些有规律性的数据,最后输出我想要的表格文件
脚本中含有4个相同的while循环,循环里面的内容是在指定行段插入数据,不同的只是while的条件语句(判断行号的语句)
在做测试的时候发现,我再扫描a目录时,第2个while没有执行,在扫描b目录时,第4个while没有执行,以此类推,在给多个目录做测试时,均出现了其中一个while没有执行的情况,剩余3个while都完美执行了。

问题相关代码,请勿粘贴截图
#!bin/bash

ls -al awk '{print $3}' | sort -u | uniq | tee owner.txt  #输出owner并存入文件
rc=$(cat owner.txt | wc -l) #计算owner数量/行数并赋值给变量rc
sed -n '2,'$rc'p' owner.txt | tee -a owner.txt #复制owner到文件
sed -n '2,'$(($rc+$rc-1))'p' owner.txt | tee -a owner.txt #第二次复制owner到文件,此时文件内有重复有序的4段owner

m=$(pwd) #将当前目录路径赋值给变量m
n=2 #设置变量n
while [[ $n < $(($rc+1)) ]]  #判断条件:n的范围在第二行到第rc行
do
  sed -i ''$n's/^/hello /g'  owner.txt   
#在第n行的行首插入文本"hello "
  sed -i ''$n's#$# '$m'  abccbbbb#g' owner.txt
 #在第n行的行尾插入文本“ '$m'  vcbbbb” 
#此时$m内含有分隔符‘/',所以此条sed命令的分隔符需要变更为除/以外的任意符号
n=$(($n+1))  # 行数加一,对下一行进行操作
done
#一下while语句同上,只有追加的数据内容有细微变化
n=$(($rc+1))
while [[ $n < $(($rc+$rc)) ]]
do
  sed -i ''$n's/^/helloo /g'  owner.txt
  sed -i ''$n's#$# '$m'  jdhym#g' owner.txt
n=$(($n+1))
done

n=$(($rc+$rc))
while [[ $n < $(($rc+$rc+$rc-1)) ]]
do
  sed -i ''$n's/^/hellooo /g'  owner.txt
  sed -i ''$n's#$# '$m'  fgdddss#g' owner.txt
n=$(($n+1))
done

n=$(($rc+$rc+$rc-1))
while [[ $n < $(($rc+$rc+$rc+$rc-2)) ]]
do
  sed -i ''$n's/^/hellooooo /g'  owner.txt
  sed -i ''$n's#$# '$m'  3411s#g' owner.txt
n=$(($n+1))
done


代码并没有完整贴上,只贴了循环这一部分,麻烦大家帮忙看看。
由于系统的环境是csh,我不清楚是不是bash在csh环境下的问题,也没测试出来,csh我不太了解
主要是为什么在测试不同的目录时,哪一个循环不执行比较随机没有规律。

  • 写回答

5条回答 默认 最新

  • hyh123a 全栈领域新星创作者 2022-05-11 16:36
    关注

    代码不全,不太好判断,
    这边简单说下一种可能的解决方法:

    解决方法

    我看了下里面的逻辑,
    四个循环里面的n并没有太大关系,
    那么是否可以试下,将每个循环里面的变量n换做不同的变量来区分,试下这四个循环是否都可以成功执行。

    代码如下:

    #!bin/bash
    ls -al awk '{print $3}' | sort -u | uniq | tee owner.txt  #输出owner并存入文件
    rc=$(cat owner.txt | wc -l) #计算owner数量/行数并赋值给变量rc
    sed -n '2,'$rc'p' owner.txt | tee -a owner.txt #复制owner到文件
    sed -n '2,'$(($rc+$rc-1))'p' owner.txt | tee -a owner.txt #第二次复制owner到文件,此时文件内有重复有序的4段owner
     
    m=$(pwd) #将当前目录路径赋值给变量m
    n=2 #设置变量n
    while [[ $n < $(($rc+1 ]]  #判断条件:n的范围在第二行到第rc行
    do
      sed -i ''$n's/^/hello /g'  owner.txt   
    #在第n行的行首插入文本"hello "
      sed -i ''$n's#$# '$m'  abccbbbb#g' owner.txt
     #在第n行的行尾插入文本“ '$m'  vcbbbb” 
    #此时$m内含有分隔符‘/',所以此条sed命令的分隔符需要变更为除/以外的任意符号
    n=$(($n+1))  # 行数加一,对下一行进行操作
    done
    #一下while语句同上,只有追加的数据内容有细微变化
    n1=$(($rc+1))
    while [[ $n1 < $(($rc+$rc ]]
    do
      sed -i ''$n1's/^/helloo /g'  owner.txt
      sed -i ''$n1's#$# '$m'  jdhym#g' owner.txt
    n1=$(($n1+1))
    done
     
    n2=$(($rc+$rc))
    while [[ $n2 < $(($rc+$rc+$rc-1 ]]
    do
      sed -i ''$n2's/^/hellooo /g'  owner.txt
      sed -i ''$n2's#$# '$m'  fgdddss#g' owner.txt
    n2=$(($n2+1))
    done
     
    n3=$(($rc+$rc+$rc-1))
    while [[ $n3 < $(($rc+$rc+$rc+$rc-2 ]]
    do
      sed -i ''$n3's/^/hellooooo /g'  owner.txt
      sed -i ''$n3's#$# '$m'  3411s#g' owner.txt
    n3=$(($n3+1))
    done
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月19日
  • 已采纳回答 5月11日
  • 修改了问题 5月11日
  • 赞助了问题酬金20元 5月11日
  • 展开全部

悬赏问题

  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备