我是linux及其shell编程的新手。
我在ubuntu和linux mint上编写了一个shell脚本,它在他们的系统上运行良好。
现在当我尝试在red hat上运行这个shell脚本时,整个输出很奇怪。
问题:
\ n字符按原样打印,不会打印新行。
发生了expr:non-integer argument
之类的错误。我只使用了三种类型的语句进行比较 -
1. if [ "$proto" = "TCP" ]
2. if [ "$prot_no" = "06" ]
3. if [ "$i" -eq 32 ]
我不知道错误的确切位置,但ubuntu和mint系统没有错误。
我听说ubuntu中的默认shell是bash
,而红帽是ksh
,但我不确定。
如果是这种情况,那么我该如何更改我的shell,或者如果可能的话,是否有任何命令可以通过bash shell运行我的脚本,这样就不需要在脚本中进行任何更改。
请帮助我....几乎不可能更改脚本中的所有\n
个字符。
修改
\n
问题这是一个示例行..
echo "\n\n$proto Header"
这里的其他错误是一些可能有帮助的代码......
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
答案 0 :(得分:4)
从
更改脚本的第一行#!/bin/sh
到
#!/bin/bash
使用echo -e
让echo
打印\n
作为换行符。
使用[[ ]]
代替[ ]
进行测试。
说明:Ubuntu上的默认shell是dash
,而不是bash
。这是一个相当有限(但因此很快)的shell,遗憾的是并非在所有Linux平台上都可用。 bash
,而不是ksh
,是我上次检查时Red Hat上的默认shell,并且几乎可以在任何地方使用,因此可移植shell脚本需要定位或将脚本编写到{{{}的公共子集1}},bash
和dash
。 (如果你感兴趣的话,最好的可移植子集大致是在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)
printf
比echo
更具可移植性,并且新行正常运行:
printf "\n\n%s Header\n" "$proto"
至于if [ "$i" -eq 32 ]
,$i
中的内容是什么?
错误消息提及expr
- 您是否在脚本中调用该程序?