在shell中,经常会处理一些命令的输出内容,如果输出内容中有多个字符串需要截取出来赋值给多个变量,比较简单的方法是先将输出内容记录到一个临时文件,然后重复多次awk指令,将输出内容分别截取到不同变量中。
09:12:11 up 494 days, 19:09, 1 user, load average: 1.70, 1.60, 1.73
注意,上述输出内容中混合了多种分隔符号,例如空格,:,,,其中如果用空格来作为分隔符还需要注意多个空格。为了简化和明确分隔符,所以首先过滤掉空格,否则字符串中多少不一的空格符会让我们的awk无所适从。这里我们使用非常常规的tr命令
09:12:11up494days,19:09,1user,loadaverage:1.70,1.60,1.73
uptime | tr -d " " | awk -F "[:,]" '{print $8" "$9" "$10}'
read a b c <<<$(echo 1 2 3) ; echo "$a|$b|$c"
注意:这里使用的第一次$()是为了将命令输出转换成变量,然后让echo指令打印出这个变量。然后再套上一个$()将echo输出的结果再次转换成变量。
警告: 我发现使用 $(echo $string) 或者 $(curl ....) 这种方式结合 <<< 来多变量赋值 这种方法在低版本bash(如macOS上使用bash 3.2.57)只能单次执行,如果在循环中,就会无法切分。但是在高版本bash 4.4.19则可以正常工作。 看起来低版本bash只能接受标准的
`read a b c <<< "$string"
也就是在 <<< 右边只能是一个字符串变量
上述shell方法测试可行,不过有一个比较奇怪的地方,在vim中编辑显示$()会提示不正常的颜色,并且导致后续shell脚本代码代码高亮不正常,似乎存在语法问题: