我正在尝试在 bash 脚本中创建一个新文件。但是,新的文件主体是这样的,它在第一行设置了一个前缀变量,下一行应该使用前缀变量并设置自己的各自变量。下面是我的 bash 脚本
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
你对引号的使用是错误的,你的代码有不必要的重复。更正和简化的版本可能是:
main() {
echo "prefix=$PWD/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' > fxp_simulator/sdk/install/ppps_client.pc
}
main
在双引号内,执行变量扩展。它们不在单引号内执行。您可以在引号内嵌入换行符;你不需要那么多
echo
s。请注意,PWD
是 shell 内置变量,因此 PWD=`pwd`
不是必需的(除非 PWD
在调用函数之前明确赋值)。
您正在将
prefix=...
打印到 file 而不是使用该名称保存 variable。
你应该做的是这样的:
PWD=`pwd`
touch $PWD/fxp_simulator/sdk/install/ppps_client.pc
prefix=$PWD/fxp_simulator/sdk/install
echo $prefix > $PWD/fxp_simulator/sdk/install/ppps_client.pc
echo exec_prefix=${prefix} >> $PWD/fxp_simulator/sdk/install/ppps_client.pc
另外,我建议你引用任意字符串。这样,您就可以避免字符串“转义”并实际运行(有点像 SQL 注入,但它是 bash 😉)
用你的代码,那就是
# either
PWD="`pwd`"
# or
PWD="$(pwd)"
一般来说,为了安全起见,只要引用所有带变量的东西即可。