我有一个简单的脚本,它从交互式键盘“读取”中获取 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}')