shell / awk脚本在ubuntu / mint上正常工作但在红帽上工作不正常

时间:2011-11-04 11:30:42

标签: linux bash shell redhat

我是linux及其shell编程的新手。

我在ubuntu和linux mint上编写了一个shell脚本,它在他们的系统上运行良好。

现在当我尝试在red hat上运行这个shell脚本时,整个输出很奇怪。

问题:

  1. \ n字符按原样打印,不会打印新行。

  2. 发生了expr:non-integer argument之类的错误。我只使用了三种类型的语句进行比较 -

    1.     if [ "$proto" = "TCP" ]
    
    2.     if [ "$prot_no" = "06" ]
    
    3.     if [ "$i" -eq 32 ]
    
  3. 我不知道错误的确切位置,但ubuntu和mint系统没有错误。

    我听说ubuntu中的默认shell是bash,而红帽是ksh,但我不确定。

    如果是这种情况,那么我该如何更改我的shell,或者如果可能的话,是否有任何命令可以通过bash shell运行我的脚本,这样就不需要在脚本中进行任何更改。

    请帮助我....几乎不可能更改脚本中的所有\n个字符。

    修改

    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 HEADERUDP HEADERICMP HEADER

    3. 但屏幕上实际打印的内容是..

      屏幕上的输出 \n\nHeader

4 个答案:

答案 0 :(得分:4)

更改脚本的第一行
#!/bin/sh

#!/bin/bash

使用echo -eecho打印\n作为换行符。

使用[[ ]]代替[ ]进行测试。

说明:Ubuntu上的默认shell是dash,而不是bash。这是一个相当有限(但因此很快)的shell,遗憾的是并非在所有Linux平台上都可用。 bash,而不是ksh,是我上次检查时Red Hat上的默认shell,并且几乎可以在任何地方使用,因此可移植shell脚本需要定位或将脚本编写到{{{}的公共子集1}},bashdash。 (如果你感兴趣的话,最好的可移植子集大致是在POSIX standard shell command language中定义的。)

答案 1 :(得分:0)

您可以更改所有\ n字符,如:

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

如果你有文件传输问题(通过windows(winspc ...等,已知的行结尾问题)
这可能会对您有所帮助:

  

转换a.txt并写入e.txt。

          dos2unix -n a.txt e.txt

您可以调用 bash 以确保您正在运行bash(如果它已安装在所需的操作系统中)。

答案 2 :(得分:0)

要启用反斜杠转义序列的自动扩展,您可以在解释器行之后将此行添加到脚本中:

shopt -s xpg_echo

'bash'联机帮助页提供了进一步的见解。

答案 3 :(得分:0)

printfecho更具可移植性,并且新行正常运行:

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

至于if [ "$i" -eq 32 ]$i中的内容是什么?

错误消息提及expr - 您是否在脚本中调用该程序?