shell_变量及读取

变量分类

局部变量:只在程序执行过程中起作用,执行完后变量回收

环境变量:变量一直存在

#### 定义变量

1
2
3
variable=hello				#如果变量中没有空格,可以不用引号
variable='hello world' #单引号中是什么就输出什么,如果中存在变量,也不会输出变量
variable="$url" #双引号中的变量可以正常输出

定义变量时,赋值号(等号)左右都不能存在空格

变量的调用

变量前面加$,同时变量本身加{}

1
echo ${name}    #当然了,大部分时候这个括号是可以省略的,只要保证后面不紧挨着其它字符

修改变量的值

只需重新赋值就行,而不能加 $ 号,只有调用变量时才能使用 $

1
2
url="www.baidu.com"
url="www.jianshu.com"

将命令的结果赋值给变量

1
2
variable=`command`
variable=$(command)

这两种方式都可以

只读变量

不能被修改/删除

1
readonly variable="www.baidu.com"

删除变量

只读变量不能被删除

1
unset variable

系统预置变量

1
2
3
4
5
6
7
8
9
10
${0}    当前程序
${1} 程序的第一个参数
${2} 程序的第二个参数
...
${*} 程序的所有参数
${#} 程序所有参数的统计

${?}    前一个命令是否执行成功,成功为0
${PWD} 当前目录
${UID}    用户id,root为0

终端读取变量

实现一个交互的作用

1
read variable

例如:取消挂载指定磁盘

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

echo "$(lsblk)"
echo -e "\033[32m which device do you want to unmount? \033[0m"
read x y
sudo umount /dev/sd$x$y
if [[ $? -eq 0 ]];then
echo -e "\033[32m the device /dev/sd$x$y has been unmounted successfully \033[0m"
else
echo -e "\033[32m device /dev/sd$x$y not mounted \033[0m"
fi

#### 给终端输入数据

1
echo ""

如果使用的是zsh,那么还可以使用 print

1
print ""

终端自动写入数据

使用到了spawnexpect,其中expect是一个软件套件,而spawn是shell自带的。Except主要进行自动化的交互,Except能够模拟用户的输入,也可以读取标准输出,适合需要用户输入的场景。

安装expect:

1
pacman -S expect

Expect中最关键的四个命令是 send,expect,spawn,interact

1
2
3
4
send:用于向进程发送字符串。send命令接收一个字符串参数,并将该参数发送到进程。
expect:从进程接收字符串。expect通常是用来等待一个进程的反馈
spawn:启动新的进程。spawn命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的
interact:允许用户交互。让用户参与这个进程。

shell脚本第一句话为:

1
#!/usr/bin/expect

比如实现 一个自动填充ssh连接时的密码输入:

1
2
3
4
5
#!/usr/bin/expect

spawn ssh root@192.168.0.195
expect "*password:" {send "123456\r"}
interact

\r 用来实现一个回车的作用

expect语法:

1
expect "pattern" {send "action"}
1
2
3
4
expect {
"pattern" {send "action"}
"pattern" {send "action"}
}