Shell单双引号嵌套变量不展开 lftp命令cert参数替换问题
问题根因
Shell 语法中,单引号包裹的字符串会完全保留字符的字面含义,不会执行变量替换、命令替换等操作。你当前使用的命令中,$cert 处于 -e 参数后的单引号包裹范围内,因此无法被替换为预先定义的路径值。
修复方案
你可以选择以下任意一种方式修改命令,实现 $cert 变量的正常展开:
方案1:拆分单引号拼接变量(推荐,无需转义内部字符)
将需要替换的变量部分从单引号中拆出,用双引号包裹变量保证特殊字符兼容,再和前后的单引号内容拼接即可:
lftp sftp://$user:@$host -e 'set net:max-retries 2; set net:reconnect-interval-base 5; set net:reconnect-interval-multiplier 1; set sftp:connect-program "ssh -a -x -i '"$cert"'"'
方案2:外层改用双引号,转义内部双引号
把 -e 后的整段参数改用双引号包裹,同时将内部原来的双引号加反斜杠转义即可:
lftp sftp://$user:@$host -e "set net:max-retries 2; set net:reconnect-interval-base 5; set net:reconnect-interval-multiplier 1; set sftp:connect-program \"ssh -a -x -i $cert\""
两种方案执行后,$cert 都会被正常替换为你预先定义的证书路径,得到你预期的最终执行命令。
内容的提问来源于stack exchange,提问作者Rupesh Patil
相关产品推荐
相关产品推荐

