KSH 脚本模拟 GNU 'ls' 命令 returns 使用参数时只有一个结果

KSH script emulating GNU 'ls' command returns only one result when parameter is used

我一直在尝试利用给我的这个脚本来突出显示 AIX 机器上的目录和其他文件...

使用:

/script/location/directory/lsc.sh -la

工作正常。正确突出显示所有内容等

使用:

/script/location/directory/lsc.sh -la *specific_parameter*

return仅匹配参数的第一条记录和其他none(实际匹配至少有十几个)。

与我使用的其他语言相比,我在 shell 脚本编写方面的经验有所欠缺。我不确定是否有明显的原因导致它仅 return 一个结果,以及允许适当的类似 ls 的功能的可能解决方案是什么。

有什么建议吗?提前感谢您的宝贵时间和帮助。

下面是脚本本身:

#!/bin/ksh

#***************************************************************************
#***************************************************************************
#* Check to see if any parameters were passed.  If not, just list files.   *
#***************************************************************************
if [[  = ""  || $(echo |cut -b1) = "/" ]]
then
   ls 
   exit 0
fi


#***************************************************************************
#* Issue ls with parameters, send to a tmp file                            *
#*  is any ls parameters - ie -la                                        *
#*  may be a directory other than CWD - ie /etc                          *
#* the grep -v is in case this is issued in home dir - we dont want to see *
#* our tmp file since it will be deleted when this script finishes.        *
#***************************************************************************
ls   | grep -v $$.tmp >> ${HOME}/$$.tmp

#***************************************************************************
#* Process the file.                                                       *
#* If dir: blue, link: light blue, char/block device: inverse blue, white  *
#* socket: red, everything else: no color                                  *
#***************************************************************************
while read LINE
do
  TYPE=$(echo $LINE|cut -b1)
  case $TYPE in
           d) echo "3[0;91m$LINE3[0m" ;;
           l) echo "3[0;92m$LINE3[0m" ;;
        [cb]) echo "3[44;37m$LINE3[0m" ;;
           s) echo "3[0;31m$LINE3[0m" ;;
           -) if [[ $(echo $LINE|cut -b4) = "x" || \
                    $(echo $LINE|cut -b7) = "x" || \
                    $(echo $LINE|cut -b10) = "x" ]]
              then
                echo "3[0;96m$LINE3[0m"
              else
                echo "3[0m$LINE"
              fi ;;
           *) echo "3[0m$LINE" ;;
  esac
done < ${HOME}/$$.tmp

#***************************************************************************
#* Clean up the tmp file                                                   *
#***************************************************************************
rm ${HOME}/$$.tmp

这不是一个很好的脚本,但是您并没有像恕我直言那样使用它。

/script/location/directory/lsc.sh -la

1 美元:-la
$2:没什么

/script/location/directory/lsc.sh -la *something*

shell 像这样进行通配符扩展:

/script/location/directory/lsc.sh -la 1something1 2something2 3something3 ...

所以通配符扩展发生在调用脚本之前

因此,最后一次调用 lsc.sh:

1 美元:-la
$2: 1something1

并且脚本执行 ls ,因此仅处理第一个目录,这就是您所看到的。


如果你想让它处理所有参数,通配符扩展后,替换:

ls   | grep -v $$.tmp >> ${HOME}/$$.tmp

来自

args=
shift
ls $args $@ | grep -v $$.tmp >> ${HOME}/$$.tmp

我在这里找到了脚本:https://www.tek-tips.com/faqs.cfm?fid=6627

您将在此处看到的最常见的 link 之一是 "Why not parse ls" at link https://unix.stackexchange.com/questions/128985/why-not-parse-ls-and-what-do-to-instead

另一件事我不能保证此修复程序适用于所有通配符条件,因此提供了 'as-is',YMMV。