Сценарий KSH, эмулирующий команду GNU 'ls', возвращает только один результат при использовании параметра - PullRequest
0 голосов
/ 19 ноября 2018

Я пытался использовать данный сценарий для выделения каталогов и других файлов в окне AIX ...

Использование:

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

отлично работает. Подсвечивает все правильно и т. Д.

Использование:

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

возвращает только первую запись, которая соответствует параметру, и ни одну из остальных (которых по крайней мере десяток или около того фактических совпадений).

Мой опыт работы со сценариями оболочки немного скучает по сравнению с другими языками, которые я использую. Я не уверен, является ли это чем-то очевидным или нет, что заставляет его возвращать только один результат, и каким возможным решением было бы предоставление надлежащей функциональности, подобной ls.

Есть предложения? Заранее спасибо за ваше время и помощь.

Ниже приведен сам скрипт:

#!/bin/ksh

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


#***************************************************************************
#* Issue ls with parameters, send to a tmp file                            *
#* $1 is any ls parameters - ie -la                                        *
#* $2 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 $1 $2 | 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 "\033[0;91m$LINE\033[0m" ;;
           l) echo "\033[0;92m$LINE\033[0m" ;;
        [cb]) echo "\033[44;37m$LINE\033[0m" ;;
           s) echo "\033[0;31m$LINE\033[0m" ;;
           -) if [[ $(echo $LINE|cut -b4) = "x" || \
                    $(echo $LINE|cut -b7) = "x" || \
                    $(echo $LINE|cut -b10) = "x" ]]
              then
                echo "\033[0;96m$LINE\033[0m"
              else
                echo "\033[0m$LINE"
              fi ;;
           *) echo "\033[0m$LINE" ;;
  esac
done < ${HOME}/$$.tmp

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

1 Ответ

0 голосов
/ 19 ноября 2018

Не очень хороший сценарий, но тогда вы не используете его, как будто он предназначен для работы ИМХО.

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

$ 1: -la
$ 2: ничего

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

Оболочка выполняет расширение по шаблону следующим образом:

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

Таким образом, расширение по шаблону происходит за до вызова сценария.

Следовательно, с последним вызовом lsc.sh:

$ 1: -la
$ 2: 1something1

и скрипт выполняет ls $1 $2, поэтому только первыйкаталог обрабатывается, это то, что вы видите.


Если вы хотите, чтобы он обрабатывал все аргументы, после расширения с подстановочными знаками замените:

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

на

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

Я нашел скрипт здесь: https://www.tek -tips.com / faqs.cfm? Fid = 6627

Одна из самых распространенных ссылок, которые вы увидите здесь,«Почему не анализ ls» по ссылке https://unix.stackexchange.com/questions/128985/why-not-parse-ls-and-what-do-to-instead

Еще одна вещь, которую я не могу гарантировать, что это исправление будет работать для всех условий подстановочных знаков, поэтому оно предоставляется «как есть», YMMV.

...