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

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

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

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 

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

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')

  • Найти старое имя каталога на удаленном сервере?
  • Что означает «$ {x %% *}» в sh?
  • Как искать «(+1)» подстроку символов в строке
  • Как получить PID подпроцесса через родительский процесс в сценарии оболочки bash?
  • Нужно получить командную строку всех запущенных демонов
  • Как найти файлы к моменту их имени?
  • Сравнение полей с разделителями
  • Сценарий Bash, создающий нежелательные файлы
  • Обновление файлов конфигурации в скрипте, который ссылается на них?
  • Как удалить папки, созданные с именами дат 2016-04-03 до 2016-10-4
  • Извлечь имя файла из другого имени файла.
  • Вывод трубы одной команды двум другим
  • Interesting Posts

    Можно ли использовать dd для клонирования только той части используемого жесткого диска?

    Лечение обратной косой черты оболочек

    Почему lvextend выделяет меньше указанного пространства?

    Как извлекать только имя заголовка в данных без перечисления самих данных

    Я могу читать с жесткого диска, но я не могу установить его только для чтения

    Что может заставить часы прыгать на 5 минут?

    x11grab с другого сервера отображения

    Как настроить экран входа Gnome в Debian

    IPFW Port Forwarding

    Как повторить команду n раз, а затем выйти?

    Обращайтесь с несколькими источниками звука в качестве одного виртуального микрофона

    Верните первые несколько столбцов, опустите все после него до разделителя и добавьте остальные?

    Недопустимый аргумент при запуске службы Cloud9 при запуске

    Как я могу получить bash, чтобы выйти с ошибкой backtick, аналогично отказу?

    Добавление нового системного вызова в Linux 3.2.x с загружаемым модулем ядра

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