【问题标题】:How to write a shell script to read from standard in and print to standard out?如何编写一个 shell 脚本从标准输入读取并打印到标准输出?
【发布时间】:2013-11-19 01:00:07
【问题描述】:

这是我第一次涉足脚本。

我正在尝试编写一个 shell 脚本来读取标准输入,然后在任何有“:”的地方将其拆分为 2 个变量并添加一个“!”在“:”之后。

我知道我需要使用“读取”实用程序将单词拆分为单独的变量,但除此之外我不太确定。

我可以在几分钟内用 Java、C++ 或 Python 完成这项工作。

感谢你们的帮助,我很感激。

【问题讨论】:

标签: bash shell scripting stdout stdin


【解决方案1】:

您似乎在问如何在 Bash 中实现 Java/C++/Python 模式。由于 Bash 与这些语言完全不同,因此您得到的答案很可能是笨拙且不习惯的。

考虑解释一下你拥有什么以及你想要什么。

如果你有

foobar
foo:bar
foo:bar:baz

你想要

foobar
foo:!bar
foo:!bar:baz

然后您可以按照您的描述走 Java/etc 路线:读取并检查 :,如果是,则将其拆分并添加 !,然后将其写出来:

# Bad way
while IFS= read -r line
do
    if [[ $line == *:* ]]
    then
        first=${line%%:*}
        second=${line#*:}
        echo "$first:!$second"
    else
        echo "$line"
    fi
done

但是,由于 Bash 不是 Java/etc,我们可以使用不同的工具和技术,并且可以简单地做到:

sed -e 's/:/:!/' 

【讨论】:

  • 在“不好的方式”中,你能告诉我为什么你需要双括号吗?因为当我在命令行中运行它时,它指出“[[:未找到”。话虽如此,下次我会更好地解释我拥有什么以及我想要什么
  • @cmonnats23,你的脚本的第一行应该是#!/bin/bash,否则它确实有可能不起作用。
  • @cmonnats23 就像@thom 所说,如果您使用#!/bin/sh,使用旧的sh 而不是新的bash 运行脚本,就会发生这种情况。由于您使用 bash 标记了帖子,因此我使用了 bash 特定功能,例如 [[ ]]
猜你喜欢
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
相关资源
最近更新 更多