Linux Shell脚本函数传参问题:带引号句子无法正确识别
Shell函数传递含空格参数的问题解决方法
你的问题核心在于Shell变量展开时的分词规则:当你执行print ${test}时,Shell会先把${test}替换成foo, "this is foo bar",然后按空白字符(空格、制表符等)分割成多个参数,这里的引号只是普通字符串,不会被当作参数边界的语法符号,所以最终传递给print的参数是foo,、"this、is、foo、bar,这就导致了错误的输出。
正确的解决方式
直接给函数传递独立的带引号参数,不要把多个参数拼接成一个字符串:
#!/bin/sh print () { # 注意用双引号包裹$1、$2,避免参数内的空格被分割 echo "$1" echo "$2" } sentence="this is foo bar" # 直接传递两个独立的带引号参数 print "foo," "${sentence}"
运行结果
执行修改后的脚本,会得到你期望的输出:
foo, this is foo bar
补充说明
如果确实需要预先存储多个参数(比如参数数量不固定的场景),在支持数组的Shell(如bash)中可以用数组来存储:
#!/bin/bash print () { echo "$1" echo "$2" } sentence="this is foo bar" # 用数组存储多个参数 args=("foo," "${sentence}") # 用数组展开传递参数 print "${args[@]}"
这种方式可以灵活处理任意数量的参数,每个数组元素对应一个函数参数。
内容的提问来源于stack exchange,提问作者Langerz
相关产品推荐
相关产品推荐

