【问题标题】:shell/awk script working fine on ubuntu/mint but not working properly on red hatshell/awk 脚本在 ubuntu/mint 上工作正常,但在 red hat 上不能正常工作
【发布时间】:2011-12-21 22:57:07
【问题描述】:

我是 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 ]
    

我不知道错误到底出在哪里,但在 ubuntu 和 mint 系统上没有错误。

我听说 ubuntu 中的默认 shell 是 bash,而红帽中的默认 shell 是 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 HEADER,UDP HEADERICMP HEADER.

但实际打印在屏幕上的是..

以上行在屏幕上的输出 \n\nHeader

【问题讨论】:

  • 感谢您的快速响应,但脚本有大约 1000 行代码。我该怎么做? .如果可能的话,告诉我有什么方法可以在不更改脚本的情况下在 red hat 上运行相同的脚本。
  • 要诊断\n 问题,我们需要查看您尝试打印换行符的示例代码。非整数参数是由于变量扩展为非整数值或为空;如果您知道此错误发生在哪一行会有所帮助。只要脚本的 bang 行正确,默认 shell 就无关紧要。如果您需要 bash,请指定 bash。
  • @Sorpigal 请看我的编辑。
  • 我只能假设$trans_or_tunn 不包含整数。我想它包含字符串expr。分配给它的代码在哪里?你试过打开set -x吗?

标签: linux bash shell redhat


【解决方案1】:

更改脚本的第一行

#!/bin/sh

#!/bin/bash

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

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

说明:Ubuntu 上的默认 shell 是 dash,而不是 bash。这是一个相当有限(但速度很快)的 shell,遗憾的是并非在所有 Linux 平台上都可用。 bash,而不是 ksh,是我上次检查时 Red Hat 上的默认 shell,并且几乎在任何地方都可用,因此可移植的 shell 脚本需要针对该目标或将脚本写入 bash、@987654334 的公共子集@ 和 ksh。 (如果你感兴趣,最好的可移植子集大致是在POSIX standard shell command language 中定义的。)

【讨论】:

  • 当我使用了四次\n\n\n\n 之后呢? -e 可能会打印一个换行符。但是如果我想打印多个换行符,应该有类似的东西。
  • "... -e 可能会打印一个换行符..." 可能不会
  • @Udit Gupta:你需要-e 来开启逃逸评估;是的,它会连续打印多个\n。如果您不想在脚本中搜索和替换 echo,您可以考虑将 alias echo='echo -e' 放在顶部,尽管这可能会产生不希望的副作用。
【解决方案2】:

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

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

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

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

          dos2unix -n a.txt e.txt

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

【讨论】:

  • 我认为 OP 的意思是 echo\n 打印为 \n,而不是作为换行符。
  • 可能你是对的,但我想我可以把我的答案作为你解释的补充,即使它不能直接解决 Udit Gupta 问题.
【解决方案3】:

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

shopt -s xpg_echo

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

【讨论】:

    【解决方案4】:

    printfecho 更便携,并且换行符可以正常工作:

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

    至于if [ "$i" -eq 32 ]$i是什么?

    错误消息提到了expr——你是在脚本中调用那个程序吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2018-03-07
      相关资源
      最近更新 更多