Shell定义
Shell 是一个命令解释权,它为用户提供了一个向 Linux 内核发送请求以便运行程序界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序
变量
- 定义变量:变量名=变量值,等号两侧不能有空格,变量名一般习惯用大写。
- 删除变量:unset 变量名 。
- 声明静态变量:readonly 变量名,静态变量不能unset。
- 使用变量:$变量名
将命令返回值赋给变量:A=`ls` 或 A=$(ls) 反引号,执行里面的命令
环境
- export 变量名=变量值,将 Shell 变量输出为环境变量。
- export 变量名=$变量名:变量值,在原变量中追加变量值。
- source 配置文件路径,让修改后的配置信息立即生效。
- echo $变量名,检查环境变量是否生效
参数
- $n :$0 代表命令本身、$1-$9 代表第1到9个参数,10以上参数用花括号,如 ${10}。
- $* :命令行中所有参数,且把所有参数看成一个整体。
- $@ :命令行中所有参数,且把每个参数区分对待。
- $# :所有参数个数。
条件判断
命令 [ condition ]
注意命令后面有空格、condition前后要有空格。非空返回0,0为 true,否则为 false
#!/bin/bash
ip=$1
usr="hnhuangjingyu"
pswd="123"
echo -e "Hi~ \n欢迎来到我的家HOME -> $HOME" //-e 会识别\n
val=`pwd`
echo "你在$val 这里路径干嘛?"
if [ $val = $HOME ];then
echo "原来在我家~"
else
echo " nonono!!! \n快来我家玩 !"
fi
read -p "给我一个数字:" a
echo -n "再来一个:" #不换行输出
read b
if [ $a = $b ];then
echo "$a == $b"
elif [ $a -gt $b ];then
echo "$a > $b !!"
elif [ $a -lt $b ];then
echo "$a < $b !!"
fi
for i in "$*"
do
echo "参数 -> $i"
done
SUM=0
for ((i=0;i<=100;i++))
do
SUM=$[$SUM+$i]
echo "当前充电 $SUM"
done
函数
#!/bin/bash
function getSum(){
SUM=$[$n1+$n2]
echo "sum=$SUM"
}
read -p "请输入第一个参数n1:" n1
read -p "请输入第二个参数n2:" n2
# 调用 getSum 函数
getSum $n1 $n2
文件操作
#!/bin/bash
#如果文件夹不存在,创建文件夹
if [ ! -d "/myfolder" ]; then
mkdir /myfolder
fi
# -f 参数判断 $file 是否存在
if [ ! -f "$file" ]; then
touch "$file"
fi
在命令中切换路径操作
#!/bin/bash
pushd ./source #进入当前目录的source目录
make #在source目录下执行make
popd #返回原目录
Expect定义
expect
是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
使用场景
在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行。而利用 expect
,则可以根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行
安装
一般情况下默认会有—apt install expect
命令
spawn
交互程序开始后面跟命令或者指定程序expect
获取匹配信息匹配成功则执行expect后面的程序动作send
exp_send
用于发送指定的字符串信息exp_continue
在expect中多次匹配就需要用到send_user
用来打印输出 相当于shell中的echoexit
退出expect脚本eof
expect执行结束 退出set
定义变量puts
输出变量set timeout
设置超时时间
使用
# Execute an expect script from a file:
expect path/to/file
# Execute a specified expect script:
expect -c "commands"
匹配符
* | 匹配任何字符串,包括空null字符串 |
---|---|
? | 匹配任意单个字符 |
[chars] | 匹配chars中指定的字符集合,比如[A-Za-z]匹配所有字母,再比如[abc]匹配abc三个字符中的任意 |
\x | 匹配字符x,提供了一种防止特殊字符转义的匹配方法,比如\可以匹配反斜杠这个字符,?可以匹配问号,可以匹配 |
示例
- 连接远程服务器
demo.sh
#!/usr/bin/expect
spawn ssh hnhuangjingyu@10.211.55.5 #通过spawn执行解释器命令
expect "password" #从控制台读取“password”字符串
send "123\n" #得到回应后就发送“123”字符串
expect eof #标志expect结束 释放控制流
使用shell脚本改写(易于脚本扩展)
#!/bin/bash
pswd="123"
/usr/bin/expect <<-EOF #使用expect脚本执行由 <<-EOF EOF 包裹起来的语句
set time 10
spawn ssh hnhuangjingyu@10.211.55.5
expect "password"
send "123\n"
expect eof
EOF
运行:
tmp » ./demo.sh ~/tmp
spawn ssh hnhuangjingyu@10.211.55.5 #通过spawn执行解释器命令
hnhuangjingyu@10.211.55.5's password:
Permission denied, please try again. #成功输入123密码
hnhuangjingyu@10.211.55.5's password: %
那么自动化的登录sh脚本为如下:
#!/usr/bin/expect
set timeout 5
set ip [lindex $argv 0]
set user "hnhuangjingyu"
spawn ssh $user@$ip
expect {
"(yes/no)?" {send "yes\n";exp_continue}
"password:" {send "123\n"}
}
interact
!请不要尝试在bash里面嵌入执行expect用来登录ssh,它会无法人机交互