Сценарий с командой zip не работает с подстановочными знаками.

Этот короткий sedскрипт может обрабатывать оба типа файлов (или даже смешанные со строками первого и второго типа):

sed '/"/!s/,/\t/g;s/","/\t/g; s/"//g'

Поскольку он не группирует выражения и не зацикливается, он должен быть намного быстрее, чем ваш скрипт.

Похоже, у вас GNU sed, так что \tработает, в противном случае вместо этого используйте литерал TAB.

0
01.12.2019, 12:59
1 ответ

Когда вы вызываете свой скрипт как

./myScript.sh myzip test*

вы передаете скрипту аргументы myzip, test1и test2. Последние два аргумента расширяются из шаблона test*оболочкой перед фактическим вызовом сценария. Обратите внимание, что test2будет доступен в $3, но ваш скрипт никогда не использует $3.

Вы можете решить это двумя способами:

  1. Выберите имя архива из списка аргументов, затем сдвиньте список, чтобы удалить имя архива из списка позиционных параметров, и, наконец, используйте"$@"(оставшиеся аргументы )в вызовеzip:

    #!/bin/sh
    
    archive=$1
    shift
    
    zip "$archive" "$@"
    

    Поскольку все переменные заключены в кавычки, это также означает, что вы сможете работать с именами файлов, содержащими пробелы и т. д.

    С bashэто могло бы быть записано более нечитаемо как

    #!/bin/bash
    
    zip "$1" "${@:2}"
    
  2. Утилита zipсама знает, как расширять шаблоны подстановки оболочки. Используйте этот факт, чтобы дать скрипту шаблон , а не список имен файлов :

    .
    #!/bin/sh
    
    zip "$1" "$2"
    

    Этот скрипт должен называться

    ./myScript.sh myzip 'test*'
    

    Заключение test*в кавычки не позволяет оболочке расширять шаблон (, на который мы полагаемся в первой альтернативе ).

3
28.01.2020, 02:21

Теги

Похожие вопросы