方法一:拼凑法
该方法的思路是:利用awk的print函数去拼凑一个shell赋值语句,然后再用shell去执行
举个例子:
date +%y-%m-%d|awk -F- '{print $1,$2,$3}'
可以得到年月日的输出结果:
21 03 01
此时,如果在shell中,需要分别保存年月日三个变量以备后用,该如何解决?
此时,我们就需要构建一个赋值语句,类似于a=xx b=xx c=xx
经过思考,我们可以改造上述例子
date +%y-%m-%d|awk -F- '{print "year="$1" month="$2" day="$3}'
(注意:此地需要使用“”把除了$1,$2...这样的字符单独扩起来)
输出结果为:
year=21 month=03 day=01
此时已经输出了一个类似赋值语句的字符串,我们需要将它作为语句再执行一次就可以得到year,month,day三个变量了,这里我们可以用eval 来处理,给上面例子继续改造,如下:
eval $(date +%y-%m-%d|awk -F- '{print "year="$1" month="$2" day="$3}')
相当于
eval "year=21 month=03 day=01"
此时我们可以测试下
echo $year $month $day
输出
2021 03 01
已经得到想要的结果了。
方法二,使用read命令
依然以上述需求为例
我们可以使用read命令来接收awk内部变量,如下
read year month day< <(date +%Y-%m-%d|awk -F- '{print $1,$2,$3}')
(注意:两个<之间有空格,后一个<与(之间没有空格,不然会报错)
此时我们也可以得到year,month,day三个变量
我对这个例子的理解是,先执行()中的子shell,然后将其执行结果重定向到一个匿名管道,然后read再从该匿名管道内读取其中的书句赋值给变量。