Почему test -n возвращает true, даже если переменная пуста? Что я делаю неправильно?

Антон написал хороший скрипт для преобразования zip-файлов в tar-файлы. С парой модификаций вы можете использовать для преобразования zip в tar и отправки файла tar в конвейере на tar, а если у вас GNU tar, вы можете использовать флаг --transformдля переименования вещей.

Модификации :используют w|в качестве режима, чтобы мы могли писать в стандартный вывод, и использовать sys.stdoutв качестве файлового объекта для открытия tar-файла:

#! /usr/bin/env python

"""zip2tar """

import sys
import os
from zipfile import ZipFile
import tarfile
import time

def main(ifn):
    with ZipFile(ifn) as zipf:
        with tarfile.open(fileobj=sys.stdin, mode='w|') as tarf:
            for zip_info in zipf.infolist():
                #print zip_info.filename, zip_info.file_size
                tar_info = tarfile.TarInfo(name=zip_info.filename)
                tar_info.size = zip_info.file_size
                tar_info.mtime = time.mktime(list(zip_info.date_time) +
                                         [-1, -1, -1])
                # zip files don't have permissions, so
                # make everything executable for now
                tar_info.mode=0755
                tarf.addfile(
                    tarinfo=tar_info,
                    fileobj=zipf.open(zip_info.filename)
                )

main(sys.argv[1])

Сохраните это как, скажем, zip2tar.py, сделайте его исполняемым, и вы можете сделать:

zip2tar.py archive.zip | tar x -C ~ --transform 's/^myDir/myRenameDir/'

Или если ~/myRenameDirуже существует:

zip2tar.py archive.zip | tar x -C ~/myRenameDir --strip-components=1

0
18.02.2020, 13:31
3 ответа

Если varсодержит пустую строку, [ -n $var ]расширяет (после разделения слова -$var)на слова [, -nи ]. Это версия -аргумента test, которая проверяет, не является ли этот единственный аргумент -пустым. Строка -nне пуста, значит тест верен.

На справочной странице GNU это упоминается сразу после вашего цитируемого отрывка:

   -n STRING
          the length of STRING is nonzero

   STRING equivalent to -n STRING

Проблема, конечно же, заключается в отсутствии цитирования, что обсуждается, например, в. Почему мой сценарий оболочки забивается пробелами или другими специальными символами? и Когда необходимо двойное -цитирование?

Обратите внимание, что не только пустая строка будет разбиваться в случае отсутствия кавычек. Проблемы также возникают, если varсодержит несколько слов:

$ var='foo bar'; [ -n $var ]
bash: [: foo: binary operator expected

Или подстановочные знаки:

$ var='*'; [ -n $var ]
bash: [: file.txt: binary operator expected
4
28.04.2021, 23:22

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

, поэтому исправление этой проблемы будет[ -n "${peopkg}" ]

0
28.04.2021, 23:22

Да вроде ни одна строка не пуста. Но вы все равно должны заключать переменные в кавычки, потому что значение имеет пробел.

.

a="hello, world"
b=""

test -n "$a"
test -n "$b"
0
28.04.2021, 23:22

Теги

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