如何在含引号字符串中插入变量值并在脚本中替换变量执行命令
解决Shell脚本中的变量替换问题
嘿,针对你提到的两个需求,我整理了实用的解决方案,帮你轻松搞定变量插入和脚本命令的变量替换:
需求一:将变量值插入已包含引号的字符串中
在Shell里,要把变量塞进带引号的字符串里,有几种可靠的方法,根据你的场景选就行:
方法1:用双引号包裹整个字符串(最常用)
双引号内部的变量会被自动解析,完美保留字符串里的路径结构:ddmmyy="300318" site="example_site" target_str="/data/stats/tor/${site}/data/${ddmmyy}/TOR/clustered_data/elasticsearch" echo "$target_str" # 输出:/data/stats/tor/example_site/data/300318/TOR/clustered_data/elasticsearch方法2:单引号拼接变量
如果字符串本身习惯用单引号包裹,可以把变量拆出来拼接,避免双引号的转义问题:target_str='/data/stats/tor/'${site}'/data/'${ddmmyy}'/TOR/clustered_data/elasticsearch'方法3:用
printf格式化字符串
适合复杂的字符串拼接,可读性更强,也能避免引号混乱:printf -v target_str "/data/stats/tor/%s/data/%s/TOR/clustered_data/elasticsearch" "$site" "$ddmmyy"
需求二:按字面运行脚本命令,同时替换变量值
要保留原命令的参数结构,只替换变量,优先用数组构建命令(最安全,能避免特殊字符导致的命令解析错误),步骤如下:
先定义好需要替换的变量:
site="your_target_site" ddmmyy="300318" yyyymmdd="20180330" # 对应ddmmyy的完整日期,按需调整按原命令的参数结构,把每个部分拆进数组里,变量会自动替换:
# 数组的每个元素对应命令的一个独立参数 split_log_cmd=( "/data/product/current/analysis/TOR/elasticsearch/splitLog" "--indir" "/data/stats/tor/${site}/data/${ddmmyy}/TOR/clustered_data/elasticsearch" "logout" "/data/tmp/incr/${site}/${ddmmyy}/logs" "--analysisOut" "/data/stats/tor/${site}/analysis/${ddmmyy}/enmlogs" "--site" "${site}" "--date" "${yyyymmdd}" "--max..." # 保留原命令的后续参数 )执行数组里的命令:
"${split_log_cmd[@]}"
备选方案:用eval执行字符串命令(注意风险)
如果你更习惯用字符串形式,也可以用eval,但要注意变量里不能包含特殊字符(比如空格、引号、$),否则会破坏命令结构:
cmd_str="/data/product/current/analysis/TOR/elasticsearch/splitLog --indir \"/data/stats/tor/${site}/data/${ddmmyy}/TOR/clustered_data/elasticsearch\" logout \"/data/tmp/incr/${site}/${ddmmyy}/logs\" --analysisOut \"/data/stats/tor/${site}/analysis/${ddmmyy}/enmlogs\" --site \"${site}\" --date \"${yyyymmdd}\" --max..." eval "$cmd_str"
小贴士:数组方法比
eval更安全,因为它会把每个参数独立处理,不会因为参数里的空格或特殊符号导致命令解析出错。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

