技术与生活 / 一篇记录
Shell 中一对引号能避免多少问题
变量展开之后还可能继续经历分词与文件名匹配。参数里一个普通空格,就可能把原来的一条路径变成两条参数,导致命令操作完全不同的对象。
先明确这里的区别
未加引号的变量会发生分词和通配符展开,包含空格的路径尤其容易出错。
以下示例使用 Bash,请在独立测试目录中理解输入、输出和退出码。
name='hello world'; printf '%s\n' "$name"
怎样判断处理正确
示例应输出完整的一行,而非两个独立参数。
用空字符串、带空格字符串和星号分别测试。printf 的格式串保持固定,把数据放在后面的参数位置,也能避免输入意外成为格式指令。
引号也不意味着可以把多个参数提前拼成一个字符串。复杂命令在 Bash 中更适合使用数组保存各个参数,再逐项展开,这样路径中的空格与选项边界都能被明确保留。
需要留意的是,不要用 eval 处理普通用户输入。
参考:Shell 文档。