Bash脚本中变量与参数的行为差异及等效实现方法咨询
让脚本参数中的命令替换生效以匹配变量方式的执行结果
你当前的问题是:用单引号传递'$(ls)'作为脚本参数时,Shell会把它当作字面字符串处理,不会解析其中的命令替换,导致file命令把$(ls)当成文件名,自然找不到对应文件。要让result2和result1得到相同结果,有两种可行方案:
方案一:调用脚本时直接解析命令替换
执行脚本时去掉单引号,让Shell在调用脚本前先解析$(ls):
./test.sh $(ls)
这样脚本的$1会直接拿到ls的输出结果,和var1内容一致,result2就会和result1输出相同内容。
注意:如果当前目录下有带空格的文件名,这种方式会把文件名拆分成多个参数,此时脚本里的
var2=$1只能拿到第一个文件名。如果要处理带空格的文件名,需要调整脚本用"$@"接收所有参数,或者传递时用引号包裹:./test.sh "$(ls)"同时脚本里修改
var2="$1"(加引号),避免文件名被拆分。
方案二:脚本内部用eval解析参数中的命令替换
如果必须用单引号传递'$(ls)',可以在脚本内部用eval命令解析参数里的命令替换逻辑,修改result2的执行语句:
result2=$(eval file ${var2})
修改后的完整脚本:
#!/bin/sh var1="$(ls)" echo -------var1------- echo $var1 var2=$1 echo -------var2------- echo $var2 # execute ls with variable result1=$(file ${var1}) # 使用eval解析参数中的命令替换 result2=$(eval file ${var2}) echo ------ result1 ------ echo $result1 echo --------------------- echo ------ result2 ------ echo $result2 echo ---------------------
执行./test.sh '$(ls)'就能得到和result1一致的输出。
注意:
eval会执行参数中的任意Shell命令,若参数来自不可信来源,可能存在安全风险,仅在可控场景下使用。
内容的提问来源于stack exchange,提问作者justmalstk
相关产品推荐
相关产品推荐

