一、shell编程
1.基础操作
1)"#!"代表shell脚本的起始符号,通过"#!"来指定具体文本类型的特殊标记。在其之后指定Linux系统中解释执行当前shell文件的具体的解释器,一般是#!/bin/bash
2)当执行shell文件的时候需要有执行权限,例如chmod 744 who.sh
需要说明的是,一般情况下回采用形如 chmod u+x who.sh 的方式来增加执行。
3)在shell文件中可以通过“#”后面直接加上注释内容来增加shell的可读性和可维护性
4)Shell脚本中其实是基本命令的组合,在交互式终端中可以写入什么内容,那么在shell脚本中就可以写入什么内容
5)同一行如果有多条指令的话,我们使用“;”来分割开不同的指令,例如 ls -l;who
2.Shell中变量及引用的实战
1)本地变量:只在当前Shell生命周期内有效
2)环境变量:
使用export关键字来把变量编程环境变量,例如:
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_60
export SCALA_HOME=/usr/local/scala/scala-2.10.4
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.6.0
export HADOOP_CONF_DIR=/usr/local/hadoop/hadoop-2.6.0/etc/Hadoop
可以通过使用“env“命令来查看系统中的环境变量的内容
3)位置参数
a.主要适用于向Shell脚本传递参数,例如./spark-shell –master spark://Master:7077
b.具体而言,$0代表脚本的名称,$1代表传入shell的第一个参数,$2代表传入shell的第二个参数,
如果要代表全部参数则需要使用$*或者$@
c.$#:代表传到脚本中的参数的数量;
$$: 脚本运行的进程号;
$?: 代表命令退出状态, 0表示没有错误,非0表示有错误;
4)${variablename}会具体提取出变量的内容,当然可以把{}去掉;例如:$HADOOP_CONF_DIR来提取出Hadoop配置文件具体所在的路径的值
5)变量赋值的时候“=“两侧不能有空格,变量名称后如果有空格则会被认为要执行Command;如果要打印变量的内容,可以通过echo $variable来打印;例如:echo $usage
#!/bin/bash
a=100
let "a+=10"
echo "a=$a"
3.系统中核心的配置文件
大家常见的一些系统配置文件.bashrc、bash_profile(.profile)、bash_logout,修改了系统文件后一般要通过source命令使其立即生效
4.命令替换
例如export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)" 实际上会使用pwd获得的值来取代dirname,并且如果使用$()则会对其进行实际求值,对我们例子来说,pwd的值为“/usr/local/spark/spark-1.6.0-bin-hadoop2.6/bin”,$0代表当前文件名称“spark-shell”
5.逻辑符号
逻辑与&&:cmd1&&cmd2
$ cat /etc/passwd && mkdir /tmp/hdfs
逻辑或||
$ cat /etc/passwddd || mkdir /tmp/hdfss
无逻辑关系;
$ [ "$Yn" = "Y" -o "$Yn" = "y" ] ; ehco ....
6.条件判断
1)if
使用if,基本语法:if … then … fi ,注意,if 条件判断后如果没有”;”则需要把then换行,如果if和then处于同样一行的话,则需要在then前面加上“;”;要终止if语句使用“fi”即可
#!/bin/bash
echo "please type your content"
read content
if [ "$content" -lt 10 ]
then echo "the content you type is small than 10"
fi
2)复杂的if..then…else…fi
补充说明:case表达式用于多分支选择语句,会根据表达式的值来选择要执行的语句,如果遇到匹配的值,就执行该值后面的语句,直到遇到“;;”为止,你可以使用*)来匹配所有未匹配到具体值的内容,示例如下所示
#!/bin/bash
echo "please enter number(0-9)"
read number
case "$number" in
1)
echo "number:1" ;;
2)
echo "number:2" ;;
*)
echo "other number:$number"
esac
7.for循环语句
#!/bin/bash
sum=0
for item in {0..10}
do
echo "the numbers:$item"
let "sum+=item"
done
echo "1+2+...+10=$sum"
8.while循环语句
1)最简单的while循环
#!/bin/bash
item=0
while (("$item" <= 10))
do
echo "value:$item"
let "item++"
done
2)复杂while循环
#!/bin/bash
echo "piease enter your number!"
read number
while [[ "$number" != 5 ]]
do
if [ "$number" -lt 5 ]
then
echo "number is too little,please enter again!"
read number
elif [ "$number" -gt 5 ]
then
echo "number is too big,please enter again!"
read number
else
exit 0
fi
done
echo "Bravo!!"
二、Linux环境下配置JDK环境变量
$ sudo vi /etc/profile
##JAVA_HOME
export JAVA_HOME=/opt/modoules/jdk1.7.0_67
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
$ java -version
三、SSH 远程无密码登陆
1.下载安装ssh服务:apt-get install ssh
2.安装自动同步服务:apt-get install ssh rsync
3.启动服务:service sshd restart
4.生成秘钥对:
ssh-keygen –t rsa –P '' -->直接回车生成的密钥对:id_rsa和id_rsa.pub,默认存储在"/home/hadoop/.ssh"目录下
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
6.修改授权key的权限:
chmod 600 ~/.ssh/authorized_keys
7.修改SSH配置文件:
su - -->登陆root用户修改配置文件
vim /etc/ssh/sshd_config -->去掉下图中三行的注释
8.测试连接:
service sshd restart -->重启ssh服务,
exit -->退出root用户,回到普通用户
ssh localhost -->连接普通用户测试
8.把我们的钥匙(公钥)送给服务器:
scp ~/.ssh/id_rsa.pub 远程用户名@远程服务器IP:~/ -->将公钥复制到远程服务器的~/目录下
如: scp ~/.ssh/id_rsa.pub hadoop@192.168.1.134:~/
可以看到我们复制的时候需要我们输入服务器的密码,等我们把SSH配置好之后这些步骤就可以不用输入密码了
9.把公钥追加到授权key中:
上一步把公钥发送到192.168.1.134服务器上去了,我们去134机器上把公钥追加到授权key中去。(注意:如果是第一次运行SSH,那么.ssh目录需要手动创建,或者使用命令ssh-keygen -t rsa生成秘钥,它会自动在用户目录下生成.ssh目录。特别注意的是.ssh目录的权限问题,记得运行下chmod 700 .ssh命令)
在134机器上使用命令:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys -->追加公钥到授权key中
rm ~/id_rsa.pub -->保险起见,删除公钥
同样在134机器上重复第四步和第五步,
service sshd restart -->重启ssh服务
10.连接
回到客户机来,输入:
ssh 192.168.1.134 -->应该就能直接连接服务器咯。