Skip to content

Latest commit

 

History

History
59 lines (38 loc) · 2.09 KB

shell编程--读取用户输入.md

File metadata and controls

59 lines (38 loc) · 2.09 KB

shell编程--读取用户输入

read命令

当read命令后没有指定接收参数的变量时,shell变量REPLY会接收所有的参数。

如果read命令指定了多个变量接收参数,如果赋值个数比变量少,则没有赋值的变量的值为空;如果赋值个数比变量多,则最后一个变量会接收所有的剩余值。

<<<

下面的代码将/etc/passwd文件中记录的root用户的信息使用:分隔开,然后通过read命令赋值给多个变量:

> $info=$(grep "root" /etc/passwd)
> old_ifs=$IFS
> IFS=:
> read user passwd uid gid desc home bash <<< $info
> IFS=$old_ifs

注意上面使用的<<<,在这里是不能使用管道符将$info的内容赋值给read后七个变量。因为管道符会在管道后的命令执行时创建子shell,管道后的命令将在子shell中执行,该命令执行结束后子shell即销毁,同时read命令后的七个变量跟随子shell销毁,所以通过管道符执行后当前shell中不存在read命令后的七个变量。

> grep "root" /etc/passwd | IFS=:; read user passwd uid gid desc home bash

上面的代码执行完后当前shell中不存在read命令后的七个变量。

<<-

输入重定向中,<<-符号可以忽略多行输入中tab自动补全的功能,转而实现在多行输入中添加制表符。

组命令 & 子shell

{ command1; command2; ... }
(command1; command2;...)

组命令在当前shell中执行,子shell在当前shell的子shell中执行命令。**组命令更快且占用更少的内存。**除非有特殊要求,一般使用组命令。

进程替换

管道线中的命令总是在子shell中运行,任何给变量赋值的命令在执行结束后变量都被销毁,相当于没有效果。

进程替换是一种奇异的展开方式,可以把子shell的输出结果当成一个用于重定向的普通文件。

<(list)
> cat < <(grep -E "^root" /etc/passwd)

作者信息 🐰