记录一下环境变量IFS特定场景使用技巧
用shell操作数据库时想更改默认的分隔符,遇到了IFS环境变量影响后续变量的问题,记录一下。
IFS:用于指定系统默认的分隔符,如空格,Tab,换行
使用过程中发现,更爱IFS对变量有影响,更爱过以后会将变量内容变成字符串
例如:
#!/bin/bash
str='echo "hello, word"'
str='echo "hello, word"'
$str
IFS=","
$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 |