如何向bash -c执行的curl下载的shell脚本传递参数
远程Shell脚本参数传递方案
推荐的两种正确写法
方案1(最稳妥,优先选择):使用
-s参数让bash从标准输入读取脚本内容curl -fsSL https://storage.googleapis.com/<Some_bucket>/rules.sh | /bin/bash -s param1 param2该写法下,
-s参数指定bash从管道传递的标准输入流读取脚本代码,后续的param1、param2会直接对应脚本内的$1、$2位置参数,不会出现语法拼接问题。方案2:遵循
bash -c的原生参数规则编写/bin/bash -c "$(curl -fsSL https://storage.googleapis.com/<Some_bucket>/rules.sh)" bash param1 param2bash -c的语法规则为:bash -c <要执行的命令字符串> <$0占位值> <$1参数> <$2参数> ...,命令字符串后的第一个参数会被赋值给脚本的$0(通常用于标识脚本名,直接填bash占位即可),后续参数才会对应脚本的$1、$2。
原有写法失效的原因
- 第一种写法
/bin/bash -c "$(curl -fsSL https://storage.googleapis.com/<Some_bucket>/rules.sh)" param1 param2:
缺少$0占位项,param1会被系统识别为$0,param2会被识别为$1,和你预期的参数对应关系完全不符,因此无法正常生效。 - 第二种写法
/bin/bash -c "$(curl -fsSL https://storage.googleapis.com/<Some_bucket>/rules.sh) param1 param2":
相当于把参数直接拼接在下载到的脚本代码末尾,如果脚本内容末尾存在换行、特殊符号等,会直接触发语法错误,甚至会把参数当做独立命令执行,属于不符合语法规范的错误写法。
内容的提问来源于stack exchange,提问作者Anurag Kumar Pandey
相关产品推荐
相关产品推荐

