shell脚本的空格分隔参数

Posted

技术标签:

【中文标题】shell脚本的空格分隔参数【英文标题】:space delimited arguments to shell script 【发布时间】:2015-05-07 09:44:43 【问题描述】:

我的要求是从 plsql 过程调用 shell 脚本并将参数从 plsql 传递给 shell 脚本。 我现在面临的问题是,如果参数之间包含任何空格,那么 shell 脚本会将其视为单独的参数值。

pl sql到shell脚本的输入如下

abc@xyz.com##ace321##https://companyurl.com XRX_Test,AL 
LDG,Test,Test,false,2,5 XRX_Test,AL LDG,Test1,Test1,false,2,5

这里 Arg1"abc@xyz.com##ace321##https:companyurl.com"Arg2"XXX_Test,AL LDG,Test1,Test1,false,2,5"Arg3"XXX_Test2,AL LDG,Test1,Test1,false,2,5"

在shell脚本中我尝试如下

echo "Process argument begins"  
    echo "The total arg:" "$#"  
    echo " Received arguments:" "$@"
    for l_temp in "$@"
        do
            echo "arguments:" + ' "' "$l_temp" '"'
            # EXTRACT_NAME+=' "' "$l_temp" '"'
            EXTRACT_NAME+=' "'
            EXTRACT_NAME+="$l_temp"
            EXTRACT_NAME+='"'
        done
    echo "Complete List" "$EXTRACT_NAME"
    echo "Process argument ends"

上面的shell脚本的输出如下(虽然我只传递了3个参数,因为空间我得到了5个参数)

Process argument begins
The total arg: 5
 Received arguments: abc@xyz.com##ace321##https://companyurl.com XRX_Test,AL LDG,Test,Test,false,2,5 XRX_Test1,AL LDG,Test1,Test1,false,2,5
arguments: +  " abc@xyz.com##ace321##https://companyurl.com "
arguments: +  " XRX_Test,AL "
arguments: +  " LDG,Test,Test,false,2,5 "
arguments: +  " XRX_Test1,AL "
arguments: +  " LDG,Test1,Test1,false,2,5 "
Complete List  "abc@xyz.com##ace321##https://companyurl.com" "XRX_Test,AL" "LDG,Test,Test,false,2,5" "XRX_Test1,AL" "LDG,Test1,Test1,false,2,5"
Process argument ends

但实际需要的o/p如下

Process argument begins
The total arg: 3
 Received arguments: abc@kbace.com##ace321##https:companyurl.com XXX_Test,AL LDG,Test1,Test1,false,2,5 XXX_Test2,AL LDG,Test1,Test1,false,2,5
arguments: +  " abc@xyz.com##ace321##https:companyurl.com "
arguments: +  " XXX_Test,AL LDG,Test1,Test1,false,2,5 "
arguments: +  " XXX_Test2,AL LDG,Test1,Test1,false,2,5 "
Complete List  "abc@xyz.com##ace321##https:companyurl.com" "XXX_Test,AL LDG,Test1,Test1,false,2,5" "XXX_Test2,AL LDG,Test1,Test1,false,2,5"
Process argument ends

有人可以帮我解决这个问题吗?我需要在我的 shell 脚本中进行哪些更改以避免空格或任何特殊字符? 谢谢

【问题讨论】:

【参考方案1】:

将参数传递给脚本时,只需将它们放在引号之间:

bash script.sh "abc@xyz.com##ace321##https:companyurl.com" "XXX_Test,AL LDG,Test1,Test1,false,2,5" "XXX_Test2,AL LDG,Test1,Test1,false,2,5"

【讨论】:

是的,我已经尝试过这种方法。我在 pl sql 中为我的参数附加了引号并发送,但是当我在 shell 脚本中接收它时,它没有引号,因此出现了问题。正如我上面提到的,当我回显 $@ 时,它会打印不带引号的参数并导致问题。 我尝试从 shell 启动脚本并找到 3 个参数,也许引号需要转义? 是的,当我从命令提示符运行 shell 并使用双引号传递参数时,它工作正常。这就是我在将引号传递给 shell 脚本之前附加引号的原因。但是当我在 shell 脚本中收到引号时,我无法获得引号 通过在" 字符前添加反斜杠来转义双引号。换句话说,您应该添加\",而不是仅仅添加"。祝你好运。 你的意思是在pl sql中?说 L_EXTRACT 有我的输入然后这就是我尝试过的 L_TEMP_VAL:=q'[\"]'||L_EXTRACT||q'[\"]';但仍然面临同样的问题。谢谢

以上是关于shell脚本的空格分隔参数的主要内容,如果未能解决你的问题,请参考以下文章

从 shell/命令提示符运行 MySQL 脚本时,空格会更改分隔符

shell脚本或R脚本中参数含有空格的处理方法

shell脚本7---图形化shell

shell脚本参数中有空格

求教关于shell脚本中参数中的转义空格

shell脚本传参中包含有空格的参数