Bash脚本生成pc文件时变量引用失效问题求助
解决Bash生成.pc文件时变量引用被解析为空的问题
问题背景
想通过Bash脚本生成ppps_client.pc文件,要求第一行定义prefix变量,后续行用${prefix}这类格式引用它,但生成的文件里这些变量引用都被解析成空值了,完全不是想要的格式。
原脚本
main() { PWD=`pwd` touch $PWD/fxp_simulator/sdk/install/ppps_client.pc echo prefix=$PWD/fxp_simulator/sdk/install > $PWD/fxp_simulator/sdk/install/ppps_client.pc echo exec_prefix=${prefix} >> $PWD/fxp_simulator/sdk/install/ppps_client.pc echo includedir=${prefix}/include >> $PWD/fxp_simulator/sdk/install/ppps_client.pc echo libdir=${prefix}/lib64 >> $PWD/fxp_simulator/sdk/install/ppps_client.pc echo 'Name: PPPS Client Library' >> $PWD/fxp_simulator/sdk/install/ppps_client.pc echo 'Description: Intel Packet Processor Pipeline Simulators Client library' >> $PWD/fxp_simulator/sdk/install/ppps_client.pc echo 'Version: 0.6.7.1' >> $PWD/fxp_simulator/sdk/install/ppps_client.pc echo Cflags: -I${includedir} >> $PWD/fxp_simulator/sdk/install/ppps_client.pc echo Libs: -L${libdir} -lppps_client -lpcap >> $PWD/fxp_simulator/sdk/install/ppps_client.pc } main
错误生成的文件内容
prefix=/home/aman/fxp_simulator/sdk/install exec_prefix= includedir=/include libdir=/lib64 Name: PPPS Client Library Description: Intel Packet Processor Pipeline Simulators Client library Version: 0.6.7.1 Cflags: -I Libs: -L -lppps_client -lpcap
期望的正确文件内容
prefix=/sandbox/1085236/fxp_simulator/sdk/install exec_prefix=${prefix} includedir=${prefix}/include libdir=${prefix}/lib64 Name: PPPS Client Library Description: Intel Packet Processor Pipeline Simulator's Client library Version: 0.6.7.1 Cflags: -I${includedir} Libs: -L${libdir} -lppps_client -lpcap
解决方案
问题根源是Bash会自动解析无引号或双引号里的$开头的变量,要保留${prefix}这种格式,得给$加转义符\,或者用单引号包裹整行(但单引号里不能用脚本里的变量,比如第一行的$PWD就不能用单引号)。
修改后的脚本如下:
main() { # 用$(pwd)替代反引号,写法更规范 PWD=$(pwd) # 把文件路径存成变量,减少重复书写 PC_FILE="$PWD/fxp_simulator/sdk/install/ppps_client.pc" # 写入prefix定义,这里$PWD需要被解析,用双引号 echo "prefix=$PWD/fxp_simulator/sdk/install" > "$PC_FILE" # 给$加转义,让Bash不解析${prefix},直接输出原格式 echo "exec_prefix=\${prefix}" >> "$PC_FILE" echo "includedir=\${prefix}/include" >> "$PC_FILE" echo "libdir=\${prefix}/lib64" >> "$PC_FILE" # 添加空行,和期望格式一致 echo "" >> "$PC_FILE" # 这些行没有脚本变量,用单引号也可以,或者双引号都行 echo 'Name: PPPS Client Library' >> "$PC_FILE" # 描述里的单引号要转义,否则会中断单引号包裹 echo 'Description: Intel Packet Processor Pipeline Simulator'\''s Client library' >> "$PC_FILE" echo 'Version: 0.6.7.1' >> "$PC_FILE" # 同样转义$,保留${includedir}和${libdir}格式 echo "Cflags: -I\${includedir}" >> "$PC_FILE" echo "Libs: -L\${libdir} -lppps_client -lpcap" >> "$PC_FILE" } main
关键要点
- 转义
$符号:要保留${变量名}格式,必须写成\${变量名},让Bash把$当成普通字符输出。 - 命令替换规范:用
$(pwd)代替`pwd`,这是Bash推荐的写法,嵌套使用时更清晰。 - 路径变量复用:把文件路径存成变量
PC_FILE,避免重复输入长路径,降低出错概率。 - 单引号转义:当内容里包含单引号时,要用
\'转义,确保字符串被正确包裹。
内容的提问来源于stack exchange,提问作者Aman .sinha
相关产品推荐
相关产品推荐

