shell 命令行输入行将逗号更改为空格

shell 命令行输入行将逗号更改为空格

我有一个简单的脚本,它从交互式键盘“读取”中获取 4 个变量,但我的命令中有一个逗号。我读取了 IFS 分隔符值,但示例仅显示它从文件而不是键盘输入中读取。是否有技巧可以更改输入,或者我是否需要通过 SED/AWK 管道传输命令,以使脚本读取正确的格式?

脚本没什么特别的,只是输入文本,它会添加输入值并回显可以与输入的文本一起运行的命令字符串。

[网络] [卡],[端口] [主机名] 0123 0123,A1 ABCDEFG

#!/bin/bash
echo "Enter network info:"
read VAR1 VAR2 VAR3 VAR4
#I have no clue what Im doing

echo -e "${green}ping test and ssh into $VAR4${NC}"

答案1

要将逗号视为单词分隔符,请尝试:

IFS="$IFS," read a b c d

这会暂时将逗号添加到IFS,这是 shell 用作字段分隔符的字符列表。

作为示例,让我们收集一些输入:

$ IFS="$IFS," read a b c d
1, 2,3 , 4

让我们看看 bash 如何解释该输入:

$ echo "a=$a b=$b c=$c d=$d"
a=1 b=2 c=3 d=4

改进

我们可以将提示和读取命令结合起来:

IFS="$IFS," read -p "Enter network info: " a b c d

文档

man bash

独立财务顾问
内部字段分隔符,用于扩展后的单词分割以及使用内置命令 read 将行分割为单词。默认值为 <space><tab><newline>

选择

如果由于某些未指明的原因,有人确实想完成sed这项任务:

read -p "Enter network info: " a b c d < <(sed 's/,/ /g; q')

该命令s/,/ /g告诉 sed 用空格替换每个逗号。 q告诉它在第一行后退出。

<表示重定向read:它告诉 shell从命令行后面的类似文件的对象中获取命令的输入。

该构造<(...)被称为流程替代并从括号中包含的命令创建一个类似文件的对象。该命令是sed用空格替换逗号的命令。

对于相同的方法,但使用 awk:

read -p "Enter network info: " a b c d < <(awk '{gsub(/,/, " "); print; exit}')

相关内容