使用条件参数和cuote参数构建bash命令

时间:2018-03-16 09:14:52

标签: bash arguments

我需要根据一些cuote或普通参数在脚本中构建一个bash命令。例如:

BAYES)
    class="weka.classifiers.bayes.BayesNet"
    A="-D -Q weka.classifiers.bayes.net.search.local.K2 -- -P 1 -S BAYES -E"
    B="weka.classifiers.bayes.net.estimate.SimpleEstimator -- -A 0.5" ;;
LOGISTIC)
    class="weka.classifiers.functions.Logistic"
    A="-R 1.0E-8 -M -1 -num-decimal-places 4" ;;
SIMPLELOG)
    class="weka.classifiers.functions.SimpleLogistic"
    A="-I 0 -M 500 -H 50 -W 0.0" ;;
SMO)
    class="weka.classifiers.functions.SMO"
    A="-C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K"
    A1="weka.classifiers.functions.supportVector.PolyKernel -C 250007 -E 1.0" ;;
IBK)
    class="weka.classifiers.lazy.IBk"
    A="-K 1 -W 0 -A "
    A1="weka.core.neighboursearch.LinearNNSearch -A"
    A2="weka.core.EuclideanDistance -R first-last" ;;
KSTAR)
    class="weka.classifiers.lazy.KStar"
    A="-B 20 -M a" ;;
...
java -Xmx"$mem"m -cp "$WEKA_INSTALL_DIR/weka.jar"  $class -s $i -t "$file" $A "$A1" $B "$B1"

但是,我的问题是在某些情况下,当$ A1为空时,“$ A1”参数无效。与“$ B1”相同。参数可以是任意组合($ A1和$ B1,$ A1没有$ B2,......)。

此外,我尝试在$ A中加入$ A1,如下所示:

A="-C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K \"weka.classifiers.functions.supportVector.PolyKernel -C 250007 -E 1.0\""

并执行:

java -Xmx"$mem"m -cp "$WEKA_INSTALL_DIR/weka.jar"  $class -s $i -t "$file" $A

但这不起作用。

3 个答案:

答案 0 :(得分:1)

您无法安全可靠地将多个参数存储在单个字符串中;你需要使用数组;这是他们的预期用例。确保初始化任何不会被使用的阵列,以便它们能够消失"扩展时。

# If A is undefined, "${A[@]}" is an empty string.
# But if A=(), then "${A[@]}" simply disappears from the command line.
A=()
B=()
A1=()
A2=()

case $something in

BAYES)
    class="weka.classifiers.bayes.BayesNet"
    A=(-D -Q weka.classifiers.bayes.net.search.local.K2 -- -P 1 -S BAYES -E)
    B=(weka.classifiers.bayes.net.estimate.SimpleEstimator -- -A 0.5);;
LOGISTIC)
    class="weka.classifiers.functions.Logistic"
    A=(-R 1.0E-8 -M -1 -num-decimal-places 4);;
SIMPLELOG)
    class="weka.classifiers.functions.SimpleLogistic"
    A=(-I 0 -M 500 -H 50 -W 0.0) ;;
SMO)
    class="weka.classifiers.functions.SMO"
    A=(-C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K)
    A1=(weka.classifiers.functions.supportVector.PolyKernel -C 250007 -E 1.0) ;;
IBK)
    class="weka.classifiers.lazy.IBk"
    A=(-K 1 -W 0 -A)
    A1=(weka.core.neighboursearch.LinearNNSearch -A)
    A2=(weka.core.EuclideanDistance -R first-last);;
KSTAR)
    class="weka.classifiers.lazy.KStar"
    A=(-B 20 -M a) ;;
esac

总是引用参数扩展。

java -Xmx"$mem"m -cp "$WEKA_INSTALL_DIR/weka.jar" \
  "$class" -s "$i" -t "$file" "${A[@]}" "${A1[@]}" "${B[@]}" "${B1[@]}"

答案 1 :(得分:0)

解决方案:

我只使用像这样的参数A解决了所有问题:

cboEmps.SelectedText = name

答案 2 :(得分:-1)

从你的问题来看,我做了:

  • 初始化变量
  • 完成案例陈述
  • 删除了一些不需要的双引号
  • 定义了一些您未为
  • 提供值的变量 如果你必须在java命令中,
  • 反斜杠你的双引号

如果某些变量需要双引号,请将它们放在变量中。这样你就不会有""如果变量为空,则在java命令中。如果是IBK,我为A1做了这个。

这将帮助您入门,根据需要进行修改:

#!/bin/bash
#

mem="512"
WEKA_INSTALL_DIR='/opt/weka'
class=""
i="value-of-i"
A=""
A1=""
B=""
B1=""
file="SOMEFILE"

case $1 in
    'BAYES')
        class="weka.classifiers.bayes.BayesNet"
        A="-D -Q weka.classifiers.bayes.net.search.local.K2 -- -P 1 -S BAYES -E"
        B="weka.classifiers.bayes.net.estimate.SimpleEstimator -- -A 0.5"
        ;;
    'LOGISTIC')
        class="weka.classifiers.functions.Logistic"
        A="-R 1.0E-8 -M -1 -num-decimal-places 4"
        ;;
    'SIMPLELOG')
        class="weka.classifiers.functions.SimpleLogistic"
        A="-I 0 -M 500 -H 50 -W 0.0"
        ;;
    'SMO')
        class="weka.classifiers.functions.SMO"
        A="-C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K"
        A1="weka.classifiers.functions.supportVector.PolyKernel -C 250007 -E 1.0"
        ;;
    'IBK')
        class="weka.classifiers.lazy.IBk"
        A="-K 1 -W 0 -A "
        A1="\"weka.core.neighboursearch.LinearNNSearch -A\""
        A2="weka.core.EuclideanDistance -R first-last"
        ;;
    'KSTAR')
        class="weka.classifiers.lazy.KStar"
        A="-B 20 -M a"
        ;;
    *)
        # default options
        ;;
esac

echo java -Xmx${mem}m -cp $WEKA_INSTALL_DIR/weka.jar  $class -s $i -t $file $A $A1 $B $B1

示例:

./test.bash LOGISTIC
java -Xmx512m -cp /opt/weka/weka.jar weka.classifiers.functions.Logistic -s value-of-i -t SOMEFILE -R 1.0E-8 -M -1 -num-decimal-places 4

./test.bash IBK
java -Xmx512m -cp /opt/weka/weka.jar weka.classifiers.lazy.IBk -s value-of-i -t SOMEFILE -K 1 -W 0 -A "weka.core.neighboursearch.LinearNNSearch -A"