【发布时间】:2018-06-18 07:55:45
【问题描述】:
对不起,如果问题很简单。我是 shell 脚本的初学者,我需要编写一个脚本,它可以在安装了 mksh 的机器上的文本文件上运行,但没有 sed 或大多数 gnu 实用程序的工作版本或兼容。
也没有安装dos2unix的版本。
脚本接收一个dos格式的文件,但它包含的字符类型非常简单(只有字母和数字,每行长度低于20个字符,少于1000行),它读取文件字符通过字符将字符添加到“行”变量。当它到达回车时,它会打印该行。用法将是 sh script.sh file.txt > newfile.txt。
脚本没有按预期工作,我不确定为什么:
#!/bin/sh
riga="";
nomefile="$1";
while IFS='' read -r -n1 carattere;
do
if [[ $carattere != *$'\r'* ]]; then
riga="${riga}carattere";
elif [[ $carattere == *$'\r'* ]]; then
print "${riga%$}";
riga="";
fi
done < "$nomefile"
这是最初编写的脚本的输出:
caratterecaratterecaratterecaratterecaratterecaratterecaratterecaratterecarattere
caratterecaratterecaratterecaratterecaratterecaratterecaratterecaratterecarattere
caratterecaratterecaratterecaratterecaratterecaratterecaratterecaratterecarattere
caratterecaratterecaratterecaratterecaratterecaratterecaratterecaratterecarattere
caratterecaratterecaratterecaratterecaratterecaratterecaratterecaratterecarattere
caratterecaratterecaratterecaratterecaratterecaratterecaratterecaratterecarattere
caratterecaratterecaratterecaratterecaratterecaratterecaratterecaratterecarattere
caratterecaratterecaratterecaratterecaratterecaratterecaratterecaratterecarattere
caratterecaratterecaratterecaratterecaratterecaratterecaratterecaratterecarattere
我在https://www.freebsd.org/cgi/man.cgi?query=ksh阅读了ksh的优秀手册页并修改了脚本如下:
#!/bin/sh
#!i=0
#!
riga="";
nomefile="$1";
while IFS='' read -r -n1 carattere;
do
if [[ $carattere != *$'\r'* ]]; then
riga="${riga}$carattere";
elif [[ $carattere == *$'\r'* ]]; then
print "${riga%$}";
riga="";
fi
done < "$nomefile"
输出与我的意图相似,但在打印行之间插入了空白行:
ID
1
2
3
4
5
6
7
8
【问题讨论】:
-
您不能在以
sh运行的脚本中使用[[ ]],它只知道[ ]。此外,您似乎有错误的重定向方式;使用< "$nomefile"从该文件中读取。您是否仅限于 sh,或者 Bash 可用? -
脚本运行在mksh中,这是系统中唯一的shell。 [[ ]] 被这个特定的 shell 正确解释,因为我有另一个脚本在其中使用它们(并且这个脚本没有使用单括号运行)。你对重定向是正确的,我正在纠正这个。
-
哦,好的。您的问题是“Bourne shell”,它是一种古老的外壳,已不再在任何地方使用,您可能应该澄清这一点并至少添加
ksh标签而不是sh。 -
我澄清了平台并按照建议更改了标签。对 bourne shell 和 sh 标记的引用是有意的,因为我认为我会安全地坚持 sh 兼容性(而不是仅使用 bash 语法):您对双括号的评论让我认为情况并非如此(我认为如您所写,bourne shell 不会解释双括号,因此 mksh 并不真正兼容)。