切分字符串赋值给多个变量

很多时候,需要将一行字符分割成多个变量,例如处理文本

这里需要注意,默认分割符是空格,如果是不同分割符,则需要设置 IFS

IFS="," read -r v_space v_email v_name v_sn <<< ",myname@example.com,不一样的烟火,123456"

然后我们就可以随便使用变量了

echo $v_name

显示输出

不一样的烟火

json和多变量案例

我在结合上述方法,采用循环方式根据 app 名字访问API来获得应用的配置(json)。

例如,单条命令

app=ABC
AK=XXXXXXXX

curl -s --location --request GET "http://api.example.com/getAppInfo.json?appName=$app" --header "apiauth-token: $AK" | jq

可以获得某个应用的信息如下

{
  "app": {
    ...
    "owner": {
      ...
      "email": "xyz@example.com",
      "nickName": "dogfood",
      "staffNo": "123",
      ...
    },
...

则我通过jq多变量读取:

可以输出

  • 然后我们可以通过多变量赋值直接读取到3个变量,方便后续shell处理

不过,上述采用 $() 来把执行结果转换为字符串变量然后通过 <<< 输入给左边3个变量的方法,如果使用了循环,则只能在高版本bash上正常工作(例如bash 4.4.19):

则在 macOS的bash 3.2.57上执行结果是错误的

但是,如果运行环境是高版本 bash 4.4.19 (linux),则完全正常

为了兼容低版本bash,脚本需要修订成 <<< 右边直接使用字符串变量 "$string" :

则通用能够正常工作输出正确结果

参考

Last updated

Was this helpful?