【发布时间】:2017-03-15 22:07:08
【问题描述】:
我不熟悉 ksh 脚本,我想将其转换为有效的 ksh 脚本。
egrep "^[^#;]" /etc/security/user |
while read x;
do
if [[ $x == '^\S+:' ]]; then
section=$x;
fi;
if [[ $section == 'nobody:' ]]; then
echo $x;
fi;
done
/etc/security/user的内容如下:
sys:
admin = true
expires = 0101000070
login = false
rlogin = false
adm:
admin = true
login = false
rlogin = false
nobody:
admin = true
expires = 0101000070
login = false
rlogin = false
invscout:
admin = true
我的目标是能够指定我想从哪个用户获取参数并让它只回显该用户的参数。例如,如果我在命令中指定“nobody”,shell 应该输出:
admin = true
expires = 0101000070
login = false
rlogin = false
我了解 ksh 不支持与 bash 相同的模式匹配正则表达式,但无法成功转换命令。任何和所有的帮助将不胜感激。不带和空格的命令如下:
grep "^[^#;]" /etc/security/user | while read x; do if [[ $x =~ '^\S+:' ]]; then section=$x; fi; if [[ $section == 'nobody' ]]; then echo $x; fi; done
【问题讨论】:
-
不要对多行代码段使用反引号;它们仅适用于少于一行的 sn-ps。
-
顺便说一句,
[[ $string =~ $re ]]实际上在 ksh 中完全合法。另一方面,\S是 PCRE 扩展,不保证在 ERE 中工作(因此,不保证在 bash 中工作)。 -
好吧,在适当的 David Korn ksh93 中完全合法。有许多不同版本的 ksh(不要让我开始研究大量糟糕、缓慢、不兼容的克隆)。指定确切的 shell 和版本会很有帮助。
-
顺便说一句,“我需要有人为我做 X”通常不是一个好的 StackOverflow 问题。我们在这里帮助您解决在尝试自己编写代码时遇到的问题,而不是代表您构建解决方案。
-
要清楚,顺便说一句,
[[ $x == '^\S+:' ]]在 bash 中也是无效的——从来没有工作过的级别无效;它检查你的字符串是否完全是^\S+:,not检查你的字符串是否匹配正则表达式。