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

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

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

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 

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

  • Пропустить первую строку (или больше) в CSV-файле, который используется для переименования файлов
  • Получение возвратов Nagios из скрипта через NRPE
  • Распечатать номера от 1 до 50
  • Почему эти бомбы вилки-ракеты работают по-разному, и каково значение & в ней?
  • Как изменить переменные
  • bash для обновления аргументов командной строки в файле конфигурации Json
  • Поиск файлов, более новых, чем другой файл в каждом подкаталоге
  • Увеличение десятичных значений до следующего целого значения
  • 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 - лучшая ОС в мире.