linux sh解释器

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中的echo
  • exit 退出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,它会无法人机交互

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值