Игнорировать специальные символы в сравнении с сценарием оболочки

В моем сценарии я сравниваю временную переменную, и если она пуста, я хочу обновить временную переменную. Но приведенный ниже сценарий не работает.

Автор сценария:

  • прочитать файл и присвоить значения другому файлу
  • Найти файлы, для которых несколько вариантов этого имени файла существуют вместе в одном каталоге
  • Извлечь имена файлов со структурой каталога в CSV-файл (отдельный файл csv для каждого имени изображения)
  • Изменить имена файлов в Makefile
  • Самый простой способ переупорядочить столбцы и управлять текстовым файлом
  • Пакетная копия в несколько каталогов
  • temp=`head -5 $filename1 | tail -1` if [ "$temp" == " " ] then temp=`head -6 $filename1 | tail -1` echo "Blank - Updated temp value" else echo "$temp not blank" fi 

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

     echo $temp | od -c 0000000 \r \n 0000002 

    Можете ли вы помочь в том, как игнорировать вышеупомянутые специальные символы?

  • Использование скрипта Fifo
  • Поиск подстроки без учета регистра в скрипте оболочки
  • Источник Bash - выберите правильную функцию, когда два источника файлов имеют одинаковое имя функции?
  • Как написать вывод на экран из службы systemd во время загрузки?
  • Как изменить переменную, которая является частью значения другой переменной
  • Как проверить, присутствует ли файл, начинающийся с определенного префикса, в каталоге в сценарии оболочки
  • 2 Solutions collect form web for “Игнорировать специальные символы в сравнении с сценарием оболочки”

    Первое:

     if [ "$temp" == " " ] 

    Оператор сравнения фактически = , а не == . Последний работает в некоторых оболочках, но не является стандартным. Кроме того, вы сравниваете переменную не с пустой строкой, а с одним пространством, которое может быть или не быть тем, что имеет ваш файл.

    Если файл может содержать дополнительные пробелы, может быть хорошей идеей просто удалить все его с помощью sed или tr . И тогда вы можете просто использовать [ -z "$temp" ] чтобы проверить, пуст ли он. Так:

     temp=$(head -5 $filename | tail -1 | tr -d ' \t\r') if [ -z "$temp" ] ; then ... 

    Вместо head и tail вы можете использовать sed для выбора одной строки:

     temp=$(sed -n '5p' | tr -d ' \t\r') if [ -z "$temp" ] ; then ... 

    ( 5p означает «в строке 5, (p) обрезать строку», а -n запрещает действие по умолчанию для печати любых строк.)


    На самом деле, вместо теста я немного соблазнился просто пройти через файл с awk скриптом, чтобы получить пятую или шестую строку в зависимости от того, есть ли у пятой что-то:

     temp=$(tr -d ' \t\r' < $filename1 | awk '(NR==5 && $0) || NR==6 {print; exit}' ) 

    ( NR==5 проверяет текущий номер строки (записи), $0 расширяется до содержимого строки и является «истинным», если строка не пуста, && и || являются обычными и / или операциями)

    Использование sed и удаление всех пробельных символов … temp=$(head -5 $filename1 | tail -1 | sed -r 's/\s+//g')

    Linux и Unix - лучшая ОС в мире.