使循环读取更清晰

时间:2017-06-08 22:07:43

标签: bash shell loops unix

在我的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

3 个答案:

答案 0 :(得分:0)

你可以做到这一点没问题。在处理此问题时,请考虑在语句中更改哪条信息,请使用变量来存储此信息。最后尝试通过使用函数,变量和排序来减少重复行。

将以下块移出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"   

答案 1 :(得分:0)

#!/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"  

答案 2 :(得分:0)

我同意,抓取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变量。对我来说,这是你想要在这里完成的事情的一个谜。无论如何,希望这有点帮助。