如何在bash变量中存储带空格的参数并正确传递给命令
这不是树莓派bash版本的问题,是Bash默认的参数展开、分词规则导致的必然现象。
普通字符串变量在展开时,你写在字符串里的引号、转义符都会被当成普通字符处理,Bash只会按照IFS(默认包含空格、制表符、换行符)对展开后的内容进行拆分,你示例里ARGS="abc \"def $VAL\""展开后拆分的结果就是三个独立部分:abc、"def、ghi",所以执行Test的时候会输出三个值。
你尝试的数组存储逻辑是完全正确的,调用失败的原因是没有用双引号包裹数组的展开表达式:当你定义ARGS=(abc "def $VAL")之后,只有调用Test "${ARGS[@]}"才能正确传递参数。这里的双引号会让Bash把数组的每个元素作为独立的单个参数传递,不会对元素内部的空格做拆分。
正确运行示例
Test() { for var in "$@"; do echo "$var"; done ; } VAL=ghi # 直接传参的预期输出 Test abc "def $VAL" # 输出结果: # abc # def ghi # 数组存参数 ARGS=(abc "def $VAL") # 正确调用方式 Test "${ARGS[@]}" # 输出结果和直接传参完全一致: # abc # def ghi
之前数组调用错误的原因
Test $ARGS、Test ${ARGS}:仅会提取数组的第一个元素abc传递,等同于只传了一个参数Test ${ARGS[@]}:没有加双引号包裹,依然会触发Bash的分词规则,元素内的空格会被当做参数分隔符,依然会拆分错误
没有特殊需求的场景下,存储多组带空格/特殊字符的参数时,优先用数组而不是普通字符串变量,能避免绝大多数参数拆分异常的问题。
内容的提问来源于stack exchange,提问作者Codemeister
相关产品推荐
相关产品推荐

