我正在尝试编写一个脚本来“构建”一个配置命令行然后运行它,但它失败并出现错误。我对 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
也可以看看: