zoukankan      html  css  js  c++  java
  • 记录一下环境变量IFS特定场景使用技巧

    用shell操作数据库时想更改默认的分隔符,遇到了IFS环境变量影响后续变量的问题,记录一下。

    IFS:用于指定系统默认的分隔符,如空格,Tab,换行

    使用过程中发现,更爱IFS对变量有影响,更爱过以后会将变量内容变成字符串

    例如:

    #!/bin/bash
    str='echo "hello, word"'
    $str
    IFS=","
    $str

    应该输出的是"hello ,word"和"hello word"

    但是结果却是只输出了一遍。原因是后一边$str输出的内容被当成了字符串,

    [root@ZABBIX ~]# sh -x test.sh

    + str='echo "hello, word"'
    + echo '"hello,' 'word"'
    "hello, word"
    + IFS=,
    + 'echo "hello' ' word"'
    test.sh:行6: echo "hello: 未找到命令
    [root@ZABBIX ~]# vim test.sh
    [root@ZABBIX ~]# sh -x test.sh
    + str='echo "hello, word"'
    + echo '"hello,' 'word"'
    "hello, word"
    + IFS=,
    + 'echo "hello' ' word"'           被当成了字符串,所以后边提示未找到命令。
    test.sh:行6: echo "hello: 未找到 命令

    解决思路:

    如果想用IFS改变默认分隔符,可以先用一个变量将IFS的值保存下来,然后更改IFS变量,最后在通过备份的值还原IFS变量。也就是让IFS在特定的时间内更改,不要影响全局

    例如

    #!/bin/bash
    #
    USER="root"
    PWD="123456"
    DB="mydb"
    #SQL=$1
    mysql_conn="mysql -u${USER} -p${PWD} -D ${DB}"
    IFS_BAK=$IFS    #备份IFS变量
    IFS=":"  更改IFS变量
    cat datafile1.txt | while read id name subject score
    do
            IFS=$IFS_BAK  #执行命令之前还原IFS变量
            ${mysql_conn} -e "insert into $1 values($id,"${name}","${subject}",${score})"
            IFS=":"   #循环下一次之前再次改变IFS变量
    done
     
  • 相关阅读:
    php内存管理机制与垃圾回收机制
    PHP Laravel5实现的RBAC权限管理操作示例
    PHP实现微信企业付款到个人零钱步骤
    ThinkPHP 6.0 管道模式与中间件的实现分析
    深入讲解 Laravel 的 IoC 服务容器
    ThinkPHP6 核心分析:系统服务
    PHP 性能优化
    PHP 7.4 新语法:箭头函数
    深入理解 PHP 的 7 个预定义接口
    Java实现 LeetCode 795 区间子数组个数 (暴力分析)
  • 原文地址:https://www.cnblogs.com/lingshu/p/11254235.html
Copyright © 2011-2022 走看看