如何在bash中传递带空格的字符串作为函数参数

时间:2017-04-09 12:06:31

标签: bash vim

我试图通过bash脚本传递一个空格为./triggerSparkApp 'Premier League'的字符串。

我是通过bash脚本以这种方式实现的;

if [ $@ -eq "${0}" ]
  then
    echo "No arguments" 
  else
       spark-submit --master yarn-client --jars hive-hcatalog-core-0.13.0.jar spark-queries-1.0-SNAPSHOT-jar-with-dependencies.jar "${0}" --driver-memory 4g --executor-memory 2g --executor-cores     
 fi

参数应该在spark-submit之前传递--driver-memory。因为它正在返回:

[: too many arguments

我将不胜感激任何帮助。感谢

2 个答案:

答案 0 :(得分:3)

我认为这就是你想要的:

if [ "$#" -eq 0 ]
then
  echo "No arguments"
else
  spark-submit --master yarn-client --jars \
    hive-hcatalog-core-0.13.0.jar \
    spark-queries-1.0-SNAPSHOT-jar-with-dependencies.jar \
    "$1" --driver-memory 4g --executor-memory 2g --executor-cores     
fi

$#扩展为参数数量。第一个参数是$1,而不是$0,所以我在spark-submit命令中替换了它。 \延续仅供阅读。

我喜欢执行参数存在测试的另一种方法是:

if (($#))
then
  spark-submit --master yarn-client --jars \
    hive-hcatalog-core-0.13.0.jar \
    spark-queries-1.0-SNAPSHOT-jar-with-dependencies.jar \
    "$1" --driver-memory 4g --executor-memory 2g --executor-cores     
else
  echo "No arguments"
fi

(( ))测试,当它包含一个计算结果为整数的表达式时,如果整数不为零则返回0(true),否则返回非零值(false)。

答案 1 :(得分:-1)

您需要在$@周围使用引号,以避免分词。并使用==进行字符串比较; 整数-eq

if [ "$@" == "${1}" ]
  then
    echo "No arguments"
  else
       spark-submit ...
 fi

或者,您可以使用不执行分词的[[ .. ]]