Скрипт shell / awk прекрасно работает на Ubuntu / Mint, но не работает должным образом на Red Hat - PullRequest
0 голосов
/ 04 ноября 2011

Я новичок в Linux и его программировании оболочки.

Я написал сценарий оболочки для Ubuntu и Linux Mint, который отлично работает на их системах.

Теперь, когда я попытался запустить этот скрипт оболочки в красной шляпе, весь вывод был странным.

Проблема:

  1. \ n символов печатается как есть, новая строка не печатается.

  2. некоторые ошибки, например expr:non-integer argument. Я использовал для сравнения только три типа операторов -

    1.     if [ "$proto" = "TCP" ]
    
    2.     if [ "$prot_no" = "06" ]
    
    3.     if [ "$i" -eq 32 ]
    

Я не знаю, где именно ошибка, но в системах ubuntu и mint ошибки не было.

Я слышал, что оболочкой по умолчанию в Ubuntu является bash, а в красной шапке - ksh, но я не уверен в этом.

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

Пожалуйста, помогите мне .... Почти невозможно изменить все \n символов в скрипте.

Edit:

  1. для \n выпуска, это образец строки ..

    echo "\n\n$proto Header"
    
  2. для других ошибок вот код, который может помочь ...

     if [ "$trans_or_tunn" -eq 1 ]
    
     then
    
    prot_no=`head -n 1 decrypt.txt | awk -F " " '{printf "%s",$7}'`
    
    if [ "$prot_no" = "06" ]
    then
            proto="TCP"
    
    else if [ "$prot_no" = "11" ]
         then
            proto="UDP"
    
         else if [ "$prot_no" =  "3a" ]
                    then
                    proto="ICMP"
    
               fi
          fi
    
       .....
    

    echo "\n\n$proto Header" эта строка должна была печатать одно из трех значений .. TCP HEADER, UDP HEADER или ICMP HEADER.

но то, что на самом деле выводится на экран, это ..

Вывод на экран для вышеуказанной строки \n\nHeader

Ответы [ 4 ]

4 голосов
/ 04 ноября 2011

Изменить первую строку скрипта с

#!/bin/sh

до

#!/bin/bash

Используйте echo -e, чтобы получить echo, чтобы напечатать \n как новую строку.

Используйте [[ ]] вместо [ ] для испытаний.

Объяснение: оболочкой по умолчанию в Ubuntu является dash, а не bash. Это довольно ограниченная (но, следовательно, быстрая) оболочка, которая, к сожалению, доступна не на всех платформах Linux. bash, а не ksh, была оболочкой по умолчанию в Red Hat в прошлый раз, когда я проверял, и доступна почти везде, поэтому для сценариев переносимых оболочек требуется либо нацеливание на них, либо написание сценариев для общего подмножества bash, dash и ksh. (Если вам интересно, лучшее переносимое подмножество примерно такое, как определено в стандартном языке команд POSIX .)

0 голосов
/ 04 ноября 2011

printf более переносим, ​​чем echo, и символы новой строки работают правильно:

printf "\n\n%s Header\n" "$proto"

Что касается if [ "$i" -eq 32 ], что находится в $i?

В сообщении об ошибке упоминается expr - вы вызываете эту программу в своем скрипте?

0 голосов
/ 04 ноября 2011

Чтобы включить автоматическое расширение последовательностей с обратным слешем, вы можете добавить эту строку в ваш скрипт после строки интерпретатора:

shopt -s xpg_echo

Страницы man 'bash' дают дополнительную информацию.

0 голосов
/ 04 ноября 2011

Вы можете изменить все \ n символов, например:

cat file | sed 's/\n/somethingelse/g' > newscript

Если у вас есть проблема с передачей файлов (через windows (winspc ... и т. Д., Известная проблема с окончаниями строк)
Это может помочьyou:

Преобразование a.txt и запись в e.txt.

          dos2unix -n a.txt e.txt

Вы можете вызвать bash , чтобы убедиться, что вызапуск bash (если он установлен в нужной ОС).

...