创建的命令行中的 bash 脚本错误

创建的命令行中的 bash 脚本错误

我正在尝试编写一个脚本来“构建”一个配置命令行然后运行它,但它失败并出现错误。我对 bash 脚本很陌生(我是 Windows 用户),我不知道我做错了什么。

这是我的脚本:

            #! /bin/sh
        # https://www.guru99.com/introduction-to-shell-scripting.html

        export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig

        PARAMS=""
        PARAMS="$PARAMS --disable-shared"
        PARAMS="$PARAMS --disable-debug"
        PARAMS="$PARAMS --with-gtk=2"
        PARAMS="$PARAMS --with-libtiff=no"
        PARAMS="$PARAMS --with-opengl=no"
        PARAMS="$PARAMS --enable-unicode"
        PARAMS="$PARAMS --with-libpng=builtin"
        PARAMS="$PARAMS --with-libjpeg=builtin"
        PARAMS="$PARAMS --enable-std_string_conv_in_wxstring"
        PARAMS="$PARAMS --host=arm-linux-gnueabihf"
        PARAMS="$PARAMS --build=x86_64-linux-gnu"

        GTK_LIBS=$(arm-linux-gnueabihf-pkg-config --libs gtk+-2.0)
        echo "GTK_LIBS = " $GTK_LIBS
        echo
        PARAMS="$PARAMS GTK_LIBS=\"$GTK_LIBS\""

        GTK_CFLAGS=$(arm-linux-gnueabihf-pkg-config --cflags gtk+-2.0)
        echo "GTK_CFLAGS = " $GTK_CFLAGS
        echo

        COMMAND="../configure $PARAMS GTK_CFLAGS=\"$GTK_CFLAGS\""
        echo "COMMAND = " $COMMAND
        echo

        echo "Running COMMAND"
        $COMMAND

这是输出:

GTK_LIBS = -L/usr/lib/arm-linux-gnueabihf -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lfontconfig -lfreetype

GTK_CFLAGS = -pthread -I/usr/include/gtk-2.0 -I/usr/lib/arm-linux-gnueabihf/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include -I/usr/include/uuid -I / usr /包括/ freetype2 -I / usr /包括/ libpng16

命令 = ../configure --disable-shared --disable-debug --with-gtk=2 --with-libtiff=no --with-opengl=no --enable-unicode --with-libpng=builtin --with-libjpeg=builtin --enable-std_string_conv_in_wxstring --host=arm-linux-gnueabihf --build=x86_64-linux-gnu GTK_LIBS="-L/usr/lib/arm-linux-gnueabihf -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lfontconfig -lfreetype" GTK_CFLAGS="-pthread -I/usr/include/gtk-2.0 -I/usr/lib/arm-linux-gnueabihf/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include -I/usr/include/uuid -I / usr /包括/ freetype2 -I / usr /包括/ libpng16”

运行命令

配置:错误:无法识别的选项:`-lgtk-x11-2.0'

尝试 `../configure --help' 获取更多信息

我不明白为什么会出现错误:好像我没有添加双引号,但是它们在那里,如果我只是从提示中的输出中复制/粘贴命令,它就会起作用。

我尝试在这里寻找答案......这让我能够在脚本中添加转义的引号,但仅此而已......

我错过了什么?

答案1

如何在运行命令之前导出变量,而不是让它们成为命令的一部分?

尝试这个:

#!/bin/sh
# https://www.guru99.com/introduction-to-shell-scripting.html

export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig

PARAMS=""
PARAMS="$PARAMS --disable-shared"
PARAMS="$PARAMS --disable-debug"
PARAMS="$PARAMS --with-gtk=2"
PARAMS="$PARAMS --with-libtiff=no"
PARAMS="$PARAMS --with-opengl=no"
PARAMS="$PARAMS --enable-unicode"
PARAMS="$PARAMS --with-libpng=builtin"
PARAMS="$PARAMS --with-libjpeg=builtin"
PARAMS="$PARAMS --enable-std_string_conv_in_wxstring"
PARAMS="$PARAMS --host=arm-linux-gnueabihf"
PARAMS="$PARAMS --build=x86_64-linux-gnu"

GTK_LIBS=$(arm-linux-gnueabihf-pkg-config --libs gtk+-2.0)
echo "GTK_LIBS = " $GTK_LIBS
echo

GTK_CFLAGS=$(arm-linux-gnueabihf-pkg-config --cflags gtk+-2.0)
echo "GTK_CFLAGS = " $GTK_CFLAGS
echo

COMMAND="../configure $PARAMS"
echo "COMMAND = " $COMMAND
echo

echo "Setting variables and running COMMAND"
export GTK_LIBS
export GTK_CFLAGS
$COMMAND

答案2

首先,除非你修改了默认的 Ubuntu /bin/sh,否则它将作为 dash 脚本而不是 bash 脚本执行。

问题是,您无法通过使用文字引号将包含空格的字符串转换为正确的 shell 引用的标记列表,然后将生成的扩展保留为未引用。简化代码,您基本上是在做:

PARAMS=foo
GTK_LIBS="bar baz"
PARAMS="$PARAMS GTK_LIBS=\"$GTK_LIBS\""

然后进行扩展$PARAMS而不使用引号,这(在 bash dash 中)将导致单词拆分为以下文字标记:

$ printf '%s\n' $PARAMS
foo
GTK_LIBS="bar
baz"

如果你实际上将 shell 更改为 bash,那么你可以使用数组来解决这个问题:

#!/bin/bash

PARAMS=("foo")
GTK_LIBS=("bar" "baz")
PARAMS+=(GTK_LIBS="${GTK_LIBS[@]}")

然后将数组扩展为"${PARAMS[@]}",正确标记参数:

printf '%s\n' "${PARAMS[@]}"
foo
GTK_LIBS=bar baz

也可以看看:

相关内容