相信程序员对于linux应该是挺熟悉的,对于基本命令也ok,但是可能有一部分人,其实对于shell的语法,总是不太熟悉(运维除外),比如我这个菜鸡,每次写shell(因为不经常写),都要先百度一波,才能写出来(写完又容易忘)。
所以该篇文章稍微记录下,这次写的内容。
背景:
就是我要往我的spark任务里面传入参数,这个参数是用户在运行的时候,指定的一个文本,里面是一些url(管他是什么呢,反正就是要我传进去),大概像这样!
当然,假设所有的url都是可用的(如果会传入有误的url,那就还要在shell里面加判断,也是不难的),不过要考虑到用户传入的文本可能会有些空行,不想把空行传进代码中。
正文:
shell如下:
#!/bin/sh
# 使用while循环读取$1文本
while read -r line
do
#判断是否是第一次读,是否读取到的数据是空行
if [ -z $x ] && [ -n $line ] ; then
x=$x"'"$line"'"
#判断是否读取到该行不为空,不为空就拼接到x中
elif [ ! -z $line ] ; then
x=$x,"'"$line"'"
fi
done < $1
echo $x
调用方式如下:
#通过sh来执行readtext.sh脚本,然后第一个位置传入要解析的文本位置
sh readtext.sh url.txt
#返回结果,类似如下:
'www.baidu.com','www.xxx.xxx.com','www.asds.com','www.dfasfsaa.com','www.asdsddgf.com'
这样,就实现了把文本中的数据按照一定格式拼接成一整个字符串。
然后我们就可以把这个字符串传入spark的代码中了。
大概是这样:
#!/bin/sh
# 使用while循环读取$1文本
while read -r line
do
#判断是否是第一次读,是否读取到的数据是空行
if [ -z $x ] && [ -n $line ] ; then
x=$x"'"$line"'"
#判断是否读取到该行不为空,不为空就拼接到x中
elif [ ! -z $line ] ; then
x=$x,"'"$line"'"
fi
done < $1
echo $x
/opt/CDH/spark-2.2.0-bin-2.6.0-cdh5.12.1/bin/spark-submit \
--一大堆设置参数 \
--class XXXXX
/opt/CDH/某个sparkjar包.jar $x
#这样就可以把x这个变量传入你运行的那个类的main方法的args的第一个位置,就是args[0]