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

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

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

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 

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

  • повторение значения из функции BASH после выполнения команды в фоновом режиме
  • Сценарий для перемещения одного типа файлов и создания подпапки, если он существует?
  • Удалить первую строку файла
  • Сценарий оболочки для выполнения сеанса telnet в ser2net
  • Как удалить символ точки из строки без вызова sed или awk снова?
  • Как удалить слова, заканчивающиеся буквой S, если дубликаты без S на конце находятся в одном списке?
  • Что можно запустить в фоновом режиме на Linux?
  • Изменить формат даты на месте с помощью команды `sed`
  • 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 - лучшая ОС в мире.