linux 系统中,为什么 变量展开时 必须用双引号保护
-
未加引号:触发IFS 词分割(空格、 tab 、换行)和 通配符扩展(
*、?、 []) -
加双引号:原样保留所有内容,此时字符串是作为一个整体,空格、换行、Tab、通配符都会被保留。
shell 词分割机制:
- 未加引号的情况下,Shell 会根据 $IFS(默认包括空格、Tab、换行)对展开后的字符串进行“词分割(word splitting)”,将其拆成多个词(参数)。
- 多个连续 IFS 字符视为一个分隔符。
例如:redis 主从架构下,想要知道当前节点的主机角色
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.151,port=6379,state=online,offset=1811049866,lag=1
master_replid:e332910bc494222c3ef10a205963001c9dfe7665
master_replid2:2abe177d5df82a0b8840509b3055682fe93070e7
master_repl_offset:1811050088
second_repl_offset:120378615
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1810001513
repl_backlog_histlen:1048576
# 赋值给变量
info=$(redis-cli -a fjdaskl info replication)
# 不加引号:输出错乱,role:master 无法匹配
echo $info | grep "^role:"
# 有引号保护,原样输出,能正确匹配
echo "$info" | grep "^role:"
role:master
浙公网安备 33010602011771号