Shell编程
Shell命令介绍
Shell是一种提供界面的应用程序,方便用户操作访问系统内核服务。
一般以 sh bash
vi hello.sh //创建一个shell脚本名字为hello.sh .sh的文件,添加的内容如下
//告诉系统其后路径所指定程序————解释此脚本文件的Shell程序
#! /bin/bash //声明是bash文件
name=zhangsan //zhangsan值传递给name,声明变量
echo $name //打印$name;打印结果为zhangsan
readonly name //只读 name 变量
unset name //删除 name 变量
username=sun //sun值传递给username,声明变量
//单引号(' '),任何字符都会原样输出,字符串中的变量是无效的
username1='hello,$username' //声明变量
echo $username1 //打印$username1;打印结果为hello,$username
//双引号(" "),可以出现转义字符
username2="hello,$username" //声明变量
echo $username1 //打印$username1;打印结果为hello,sun
email="123456@qq.com" //声明变量
echo ${#email} //打印$#email;打印结果为13
chmod u+x hello.sh //给hello.sh文件 赋予 执行权限
Shell注释——以#开头的行,会被解析器忽略
Shell脚本执行 文件 三种方式
第一种 执行(.)+输入脚本绝对路径或相对路径(注:执行必须是一个可执行文件):
./hello.sh //执行(.)hello.sh文件
第二种 执行(sh或bash)+脚本(注:当脚本没有执行[x]权限时,root和文件所有者都可执行):
sh hello.sh //执行(sh)hello.sh文件
第三种 执行(source)+脚本(注:当脚本没有执行[x]权限时,root和文件所有者都可执行):
source hello.sh //执行(source)hello.sh文件
区别:前两种会开一个新进程,后一种不会;注:在配置profile时,所有变量前要加 export——可以将当前进程变量传递给子进程去使用
Shell参数传递
执行Shell脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n代表一个数字
参数处理 | 参数说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何表明有错误。 |
$0 | 执行的文件名 |
Shell函数
可以带function fun()定义,也可以直接fun()定义,不带任何参数。
参数返回,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值,return后跟数值n(0-255
虚拟机相互免密钥
多个窗口同时输入内容——在Xshell的工具→发送键输入到所有会话
每台要免密钥的机器都要输的命令,例如:下面是三台主机免密钥
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa //三台主机分别生成密钥对(公钥和私钥),三台机器都要输入
vim /etc/ssh/ssh_config //host验证,进入ssh_config文件添加数据,三台机器都要输入
//脚本内容如下:(快捷键:G 快速到文本最后一行;o 跳到下一行)
StrictHostHostKeyChecking no
UserKnownHostsFile /dev/null
//将密钥分别拷贝给自己和别人
ssh-copy-id -i ~/ .ssh/id_rsa.pub root@node01 //主机名node01,三台机器都要输入
ssh-copy-id -i ~/ .ssh/id_rsa.pub root@node02 //主机名node02,三台机器都要输入
ssh-copy-id -i ~/ .ssh/id_rsa.pub root@node03 //主机名node03,三台机器都要输入
//检验——在node01机器上,输入下方命令
ssh root@node03 //成功 从node01进入 node03
ssh root@node02 //成功 从node03进入 node02
ssh root@node01 //成功 从node02进入 node01