Bash读取Redis含空格Key值失败,求解决方案
解决Bash中Redis读取带空格Key的问题
问题原因
直接使用$key而不加双引号时,Bash会把空格当作参数分隔符,将带空格的Key拆分成多个参数传给redis-cli,导致命令参数数量错误,触发ERR wrong number of arguments报错。另外你文件里带引号的Key,直接读取后引号会被当成Key的一部分,也会导致找不到对应Key。
解决方案
方案1:处理带引号的Key并正确传递参数
如果你的keys文件里带空格的Key是用双引号包裹的,先去掉引号再执行命令:
while IFS= read -r line; do # 移除首尾的双引号 key=$(echo "$line" | sed 's/^"//;s/"$//') redis-cli -h 127.0.0.1 get "$key" done < keys
IFS= read -r line:保证读取的行完整保留开头、结尾的空格,且不转义反斜杠,避免破坏Key内容。sed命令用来去掉Key首尾的双引号——文件里的引号只是标识带空格的Key,不是Key本身的一部分。get "$key":用双引号包裹变量,让Bash把整个Key当作单个参数传递。
方案2:无引号Key的直接处理
如果keys文件里的带空格Key没有引号(直接写a blank key),只需确保正确引用变量:
while IFS= read -r key; do redis-cli -h 127.0.0.1 get "$key" done < keys
这里IFS= read -r key是核心,它能完整读取包含空格的行,再通过双引号包裹$key,保证参数传递不拆分。
方案3:用xargs批量处理(可选)
想简化命令的话,也可以用xargs,注意指定换行符作为分隔符:
xargs -d '\n' -I {} redis-cli -h 127.0.0.1 get "{}" < keys
-d '\n':让xargs以换行符分割输入,避免空格拆分参数。-I {}:把读取的每一行替换为{},再用双引号包裹确保完整传递。
内容的提问来源于stack exchange,提问作者mark.gao
相关产品推荐
相关产品推荐

