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

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日
  • 展开全部

悬赏问题

  • ¥20 Yolov5训练报错
  • ¥15 Unity发布gzip压缩的webgl之后让浏览器可以正常显示画面
  • ¥15 有没有人知道这种提示怎么关?现在不做ts项目了不知道咋关了,求解,现在我以前的js项目都是这种提示了
  • ¥15 为什么mysql做了碎片化处理data_free还是很高
  • ¥15 single positional indexer is out-of-bounds
  • ¥15 LSTM 模型数据量需要多少?
  • ¥15 mysql数据抓包开发报表
  • ¥15 linux系统下安装office打不开
  • ¥20 rsync脚本分发错误,文件不齐全
  • ¥15 labview顺序结构与时间延时