使用 bash 创建一个新文件并使用前几行中的变量

问题描述 投票:0回答:2

我正在尝试在 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
linux bash
2个回答
1
投票

你对引号的使用是错误的,你的代码有不必要的重复。更正和简化的版本可能是:

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
在调用函数之前明确赋值)。


0
投票

您正在将

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)"

一般来说,为了安全起见,只要引用所有带变量的东西即可。

© www.soinside.com 2019 - 2024. All rights reserved.