我在SunOS
作为文件运行下面的代码.sh
#!/usr/bin/bash
#lerning linux scripting
#
printf "%-5s %-10s %-4sn" No Name Mark
printf "%-5s %-10s %-4.2fn" 1 James 80.1234
printf "%-5s %-10s %-4.2fn" 2 Sarah 99.8923
但是当运行在 1 以上时,我得到的误差低于SunOS
No Name Mark
: arithmetic syntax error.sh[5]: printf: 80.1234
: arithmetic syntax error0.1234
linux_sc.sh[5]: printf: warning: invalid argument of type f
80.12
: arithmetic syntax error.sh[6]: printf: 99.8923
: arithmetic syntax error9.8923
linux_sc.sh[6]: printf: warning: invalid argument of type f
99.89
所以是的,很确定你使用的是具有Windows样式CRLF行尾的脚本,而Unix系统使用LF。当您在 Windows 上写入文件并且不以转换行尾的方式将其传输到另一台计算机时,会发生这种情况。
获取示例脚本并通过unix2dos
运行它,然后尝试运行它,得到:
No Name Mark
: invalid numberprintf: 80.1234
1 James 0.00
: invalid numberprintf: 99.8923
2 Sarah 0.00
不完全相同的输出,但我是在 Linux 上测试,而不是 SunOS,所以这是意料之中的。不过,足够接近,表明这是问题所在。
如果您在 SunOS 盒子上安装了dos2unix
,请通过它运行脚本,看看是否可以解决问题。或者perl -pi -e 's/r//' your.sh
是剥离无关回车的另一种方法。或tr -d 'r' < your.sh > new.sh
或任何其他方式;仅取决于典型的 SunOS 设置已安装的内容。我已经很多年没有使用它了;不记得我的头顶了。