向包装外壳脚本添加参数

时间:2018-10-05 19:58:51

标签: shell sh

我有一个包装器外壳脚本,需要在调用编译器之前添加一些库并包含路径。

#!/bin/sh
LDIRS="-L/opt/lib"
LDFGS="-llibA -llibB"

exec /opt/bin/xxx $@ $LDIRS $LDFGS

这对于编译一个简单的测试用例非常有用

compiler -o test test.c

如果另一个程序想要调用我的编译器并传递包含这样的包含目录,则会崩溃

compiler -o in_file.xx -I/xxx -I/xxx

如何概括这一点,以获得将那些包含附加到LDFGS的预期行为?

1 个答案:

答案 0 :(得分:1)

我认为var j = "{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:16.881\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":527,\"Message\":\"SyncData: Billing Software SyncData() called\"}\r\n{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:17.060\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":38,\"Message\":\"SyncData: Start\"}\r\n{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:17.111\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":44,\"Message\":\"SyncData: LocalConnectionString = Data Source=PARAM\\\\MSSQL2K8r2;Initial Catalog=HQPharma;User ID=sa;Password=developer;\"}"; for(var key in j){ console.log(j[key]); } LDIRS的顺序是相关的问题;用户提供的其他内容应该LDFGS结尾(即需要在所有LDFGS至{{1 }}),但不要使用当前的实现。因此,我认为将LDIRS参数添加到/opt/bin/xxx中。如果我误解了您的问题,请更清楚地说明您想要的内容。否则请继续阅读。

您有两种选择来解决这样的问题。您要么实现某种智能,要么理解给定的选项,然后将其正确分类到它们所属的列表中。一种解决方法可能是这样的:

-I/xxx

正如@ charles-duffy所指出的那样,如果您的任何参数包含空格,则使用支持适当列表的LDFGS或类似名称会更健壮。如果您确定不会发生这种情况,那么现在应该可以了。但是当您的代码维护者因此而陷入麻烦时,他们会讨厌您。因此,#!/bin/sh LDIRS="-L/opt/lib" LDFGS="-llibA -llibB" PRE="" for argument in "$@" do case "$argument" in -I*) LDFGS="$LDFGS $argument" ;; # other patterns could go here as well *) # else case PRE="$PRE $argument" ;; esac done exec /opt/bin/xxx $PRE $LDIRS $LDFGS 中的一个可读性较低的版本应解决此问题:

bash

(每当使用sh时,都需要添加免责声明:#!/bin/sh LDIRS="-L/opt/lib" LDFGS="-llibA -llibB" PRE="" for argument in "$@" do case "$argument" in -I*) LDFGS=`printf "%s %q" "$LDFGS" "$argument"` ;; # other patterns could go here as well *) # else case PRE=`printf "%s %q" "$PRE" "$argument"` ;; esac done eval "exec /opt/bin/xxx $PRE $LDIRS $LDFGS" 带有危险,其中一些与安全性相关,因此请在广泛使用它之前了解更多有关此危险的信息。不过,这种情况应该没问题。)

如果您认为无法了解应该进入evalevalLDFGS的所有模式,则需要将其交给用户。不幸的是,那么用户需要了解更多并传递此信息。然后,呼叫将需要看起来有所不同。

一种方法是这样

LDIRS

现在通话需要看起来像这样:

PRE

同样,如果您遇到空间问题,则应考虑使用适当的阵列解决方案,或者至少考虑我上面提出的丑陋解决方法。