【问题标题】:make loop read clearer使循环读取更清晰
【发布时间】:2017-06-08 22:07:42
【问题描述】:

在我的 while 循环中,我正在做一个测试,但这似乎真的是多余的,我认为可能有更好的解决方案来实现这个,比如“案例”结构?如果有人可以推荐如何减少冗余,那就太好了,谢谢!基本上,我怎样才能更好地重组这个循环?

循环:

 if [ "$cursor" -eq "1" ]
    then    
        Links="Links: $(ls -ld / | cut -d" " -f2)"
        Owner="Owner: $(ls -ld / | cut -d" " -f3)"
        Group="Group: $(ls -ld / | cut -d" " -f4)"
        Size="Size: $(ls -ld / | cut -d" " -f5)"
        Modified="Modified: $(ls -ld / | cut -d" " -f6-8)"
        echo "$Links  $Owner  $Group  $Size  $Modified" 
    elif [ "$cursor" -eq "2" ]
    then    
        Links="Links: $(ls -ld /home | cut -d" " -f2)"
                    Owner="Owner: $(ls -ld /home | cut -d" " -f3)"
                    Group="Group: $(ls -ld /home | cut -d" " -f4)"
                    Size="Size: $(ls -ld /home | cut -d" " -f5)"
                    Modified="Modified: $(ls -ld /home | cut -d" " -f6-8)"
                    echo "$Links  $Owner  $Group  $Size  $Modified"
        elif [ "$cursor" -eq "3" ]
    then
        Links="Links: $(ls -ld ~ | cut -d" " -f2)"
                    Owner="Owner: $(ls -ld ~ | cut -d" " -f3)"
                    Group="Group: $(ls -ld ~ | cut -d" " -f4)"
                    Size="Size: $(ls -ld ~ | cut -d" " -f5)"
                    Modified="Modified: $(ls -ld ~ | cut -d" " -f6-8)"
                    echo "$Links  $Owner  $Group  $Size  $Modified"         
    else
        temp=`expr $cursor - 1` 
        curDir=${currentdir[$temp]}
        Links="Links: $(ls -ld $curDir | cut -d" " -f2)"
                    Owner="Owner: $(ls -ld $curDir | cut -d" " -f3)"
                    Group="Group: $(ls -ld $curDir | cut -d" " -f4)"
                    Size="Size: $(ls -ld $curDir | cut -d" " -f5)"
                    Modified="Modified: $(ls -ld $curDir | cut -d" " -f6-8)"
                    echo "$Links  $Owner  $Group  $Size  $Modified"  
fi

【问题讨论】:

  • 真的不应该解析ls的输出。见BashFAQ #3mywiki.wooledge.org/ParsingLs
  • (即使您打算这样做,运行ls once 并阅读该单曲会更明智调用的输出分为五个字段,而不是单独运行五次并每次提取一个字段)。
  • 如果你有 GNU stat,你可以真正制作一个 stat -c 调用,在一个命令中发出你的链接、所有者、组、大小和 mtime 输出。

标签: bash shell loops unix


【解决方案1】:

你可以做到这一点没问题。当处理这个问题时,想想你的语句中有哪些信息正在发生变化,使用一个变量来存储这些信息。最后尝试通过使用函数、变量和排序来减少重复行。

将以下块移出 if/else 语句。在每个 if 语句中,设置变量 curDir="[dir]"

 Links="Links: $(ls -ld $curDir | cut -d" " -f2)"
 Owner="Owner: $(ls -ld $curDir | cut -d" " -f3)"
 Group="Group: $(ls -ld $curDir | cut -d" " -f4)"
 Size="Size: $(ls -ld $curdir | cut -d" " -f5)"
 Modified="Modified: $(ls -ld $curdir | cut -d" " -f6-8)"
 echo "$Links  $Owner  $Group  $Size  $Modified"   

【讨论】:

    【解决方案2】:
    #!/bin/bash
    cursor="$1"
    case "$cursor" in
        1) curDir="/"
        ;;
        2) curDir="/home"
        ;;
        3) curDir="${HOME}"
        ;;
        *) curDir=${currentdir[$temp]}
        ;;
    esac
    
    Links="Links: $(ls -ld $curDir | cut -d" " -f2)"
    Owner="Owner: $(ls -ld $curDir | cut -d" " -f3)"
    Group="Group: $(ls -ld $curDir | cut -d" " -f4)"
    Size="Size: $(ls -ld $curDir | cut -d" " -f5)"
    Modified="Modified: $(ls -ld $curDir | cut -d" " -f6-8)"
    echo "$Links  $Owner  $Group  $Size  $Modified"  
    

    【讨论】:

      【解决方案3】:

      我同意,抓取 ls 不是最好的,但我不确定您的用例是什么。这是我想出的解决方案:

      #!/bin/bash
      
      my_stat()
      {
        path="$1"
      
        IFS=":" read links owner group size modified <<<$(ls -ld $path | awk '{print $2":"$3":"$4":"$5":"$6" "$7" "$8}')
        echo "$links $owner $group $size $modified"
      }
      
      case $cursor in
        1) my_stat /;;
        2) my_stat /home;;
        3) my_stat ~;;
        *) temp=$((cursor - 1))
           curDir="${currentdir[$temp]}"
           my_stat "$curDir"
        ;;
      esac
      

      即使这也可能不是实现目标的最佳方式。让我印象深刻的一件事是$cursor 变量。这对我来说是一个谜,你想在这里完成什么。无论如何,希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 2012-03-22
        • 1970-01-01
        • 2015-12-10
        相关资源
        最近更新 更多