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。
我一直在尝试利用给我的这个脚本来突出显示 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。