当用户在Unix shell中输入FRUIT=apple
时,如何从输入FRUIT
中分别获得名称apple
和FRUIT=apple
?
echo -e "\nEnter inputs here: \c"
read inputs
## user input "FRUIT=apple"
有什么方法可以从输入中获取部分文本吗?
我们可以使用expr
命令解决问题吗?如果可以,怎么办?
答案 0 :(得分:2)
您可以这样操作,例如:
$ IFS== read -r key value
FRUIT=apple
$ echo "$key"
FRUIT
$ echo "$value"
apple
答案 1 :(得分:2)
尝试使用cut
命令并将定界符作为"="
传递。相同的右侧为apple
,左侧为FRUIT
。
cat file_name | cut -d "=" -f1
答案 2 :(得分:2)
您可以将expr
与正则表达式结合使用,例如:
$ str='FRUIT=apple'
$ key=$(expr "$str" : '\([^=]*\)')
$ value=$(expr "$str" : '.*=\([^=]*\)')
$ echo "<$key> <$value>"
<FRUIT> <apple>
表达式expr string : regex
返回匹配的字符数,或者(如上所述),如果有捕获组\(...\)
,它将返回该捕获组。正则表达式以隐式^
锚开头。
key
的表达式将所有内容匹配到第一个=
为止; value
的那个捕获了(最后一个)=
符号之后的所有内容。
所有这些,expr
是shell不够强大以无法使用内置函数进行文本处理时的停留时间;任何现代外壳都可以做到。例如:
分解=
并读入两个变量:
IFS='=' read -r key value <<< "$str"
使用参数扩展:
key=${str%=*}
value=${str#*=}