1、脚本:将有限的shell命令放到文件中。
2、作用:自动化执行指令
3、实质:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析指令并执行(它不需要编译)
4、shell是用户和内核通信的一种方式
shell脚本基础
1、脚本后缀
文件名.sh
2、shell脚本
是一门弱类型语言
程序=算法+数据
注释方式
单行注释
#!/bin/sh
echo "hello world"
#echo "hello world"
多行注释
方式1
:<<!
#注释内容
!
#!/bin/sh
echo "hello world"
echo "hello shell"
:<<!
echo "hello world"
echo "hello shell"
!
#output---------
hello world
hello shell
方式2
if false; then
#注释内容
fi
#!/bin/sh
echo "hello world"
echo "hello shell"
if false; then
echo "hello world"
echo "hello shell"
fi
#output---------
hello world
hello shell
方式3
<< ‘command’
#注释内容
command
此处command可定义为任意变量名
#!/bin/sh
echo "hello world"
echo "hello shell"
<< 'command'
echo "hello world"
echo "hello shell"
command
#output---------
hello world
hello shell
3、shell脚本的执行顺序
从上往下,一条条执行
#脚本格式
#!脚本解释器
#!/bin/bash
1、系统提供的shell解释器有:sh、ash、bash
2、查询系统默认的解释器:echo $SHELL
3、不加#!系统则使用默认解释器
4、语言
1、数据
shell只有唯一数据类型:字符串
1、字符串常量
Col1 | Col2 |
---|---|
‘abc’ | 所有字符都为字符 |
“abc” | 可引用变量或执行shell命令 |
abc | 可引用变量或执行shell命令 |
建议使用上两种写法,便于区分字符串与变量
2、字符串变量
1、定义与引用变量
1、定义方式
变量名=值
shell脚本中定义变量必须初始化赋值
值的写法用常量的三种写法均可,不会对内容产生实质影响
清除变量值:unset 变量名
2、引用方式
序号 | 写法 | 类型 |
---|---|---|
1 | $变量名 | 直接引用 |
2 | ${变量名} | 字符串中进行引用 |
3 | {$变量名} | 特殊引用:该方式在打印时会带有{} |
4 | ${#变量名} | 获取子字符串的长度 |
5 | ${变量名:number1:number2} | 提取子字符串,从第number1打印到number2,包含空格,下标从0开始 |
#!/bin/sh
name=ming chen
echo ${name:2:6}
#output
ng che
1、 用于区分字符串还是变量 2 、变量的识别为 用于区分字符串还是变量 2、变量的识别为 用于区分字符串还是变量2、变量的识别为符号后连续的所以字符直到遇到空格、回车、{}。即在$与 空格、回车、{ 、} 中间部分的内容为变量名
3、先引用后定义。注意字符串之间区别 ’ ’ " "
4、获取子字符串的长度
${#变量名}
提取子字符串:该字符中的一部分 my name is lifei
${变量名:1:4} ps:字符串是连续空间,下标从0开始
3、举例
#!/bin/bash
a=1 b='1' c="1"
echo a b c $a $b $c
echo abd${a}a$bb{$c}c
echo 'abd${a}a$bb{$c}c'
echo "abd${a}a$bb{$c}c"
#运行结果
a b c 1 1 1
abd1a{1}c
abd${a}a$bb{$c}c
abd1a{1}c
2、变量分类
1、局部变量
在shell脚本中定义的变量
2、环境变量
所有的程序,包括Shell启动的程序,都能访问的变量(系统为每个程序都定义了该变量)
序号 | 标志 | 解释 |
---|---|---|
1 | $PATH | 系统环境变量 |
2 | $HOME | 用户主目录 |
3、shell变量
shell特殊变量
序号 | 标志 | 解释 |
---|---|---|
1 | $? | 函数或者命令的返回值显示最后命令的退出状态,0表示没有错误,其他表示有错误 |
2 | $1 | 传递给该shell脚本的第一个参数 |
3 | $2 | 传递给该shell脚本的第二个参数 |
4 | $$ | 脚本运行的当前进程ID号 |
5 | $@ | 传给脚本的所有参数的列表 |
6 | $* | 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 |
$1 $2 $?(函数或命令的返回值)
一个shell脚本只有一个$?
#!/bin/bash
echo "$?"
echo "$1"
echo "$2"
echo "$#"
echo "$0"
echo "$@"
echo "$*"
echo "$$"
for i in $*
do
echo $i
done
exit 65
#output
[dj@softeem shell_learn]$ ./shell.sh a b c
0
a
b
3
./shell.sh
a b c
a b c
7859
a
b
c
[dj@softeem shell_learn]$ echo $?
65
[dj@softeem shell_learn]$
4、字符串变量
**定义方式:**变量名=值
eg: a a=‘abc’
5、只读变量
内容不可改变
定义方式: readonly 变量名=值
2、输入输出
输出
将内容输出到屏幕
echo $变量名
输入
从键盘上输入内容
read 变量名
read -p “提示符” 变量名
在此不需要定义变量名,相当于定义变量名
#!/bin/sh
read -p "input" a
echo "$a"
#output
keyborad input: a
a
5、执行shell脚本
./文件名
由用户手动调用
执行脚本常见问题
在windows环境下写sh脚本导致的无法执行问题解决
1、安装dos2unix
sudo apt-get install dos2unix
dos2unix 文件名
即可转换
2、vi打开脚本,底行模式输入:
set ff=unix
扩展
1、终端打开系统自动调用/etc/profile 或 ~/.bashrc
/etc/profile
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,系统的公共环境变量在这里设置开机自启动的程序,一般也在这里设置
~/.bashrc
这个文件一般设置与个人用户有关的环境变量,如交叉编译器的路径等
2、执行方式不同
调用方式 | 含义 |
---|---|
./文件名 | 如果#!指定指定的解析器不存在 才会使用系统默认的解析器 |
bash 文件名 | 如果bash不存在 才会使用默认解析器 |
. 文件名 | 直接使用默认解析器解析 |
3、shell命令扩展
1、区间数 seq
序号 | 表达形式 | 现象 |
---|---|---|
1 | seq LAST | 从1累加1打印到从1循环打印到LAST |
2 | seq FIRST LAST | 从FIRST累加1打印到从1循环打印到LAST |
3 | seq FIRST INCREMENT LAST | 从FIRST累加INCREMENT打印到从1循环打印到LAST |
for n in `seq 1 2 10`
do
echo "${n}"
done
#output
1
3
5
7
9
2、重定向
将该文件描述符重新指向其他文件或设备
内核(Linux:每一个进程(正在执行的程序)都有文件描述符表(数组),该文件描述符指向文件或文件设备。
序号 | 表达形式 | |
---|---|---|
1 | command1> 文件 | 添加内容 |
2 | command1>> 文件 | 添加内容追加到文件末尾 |
3、测试某主机状态
ping IP/域名/主机名
参数 | 含义 |
---|---|
-c | 次数 |
-w | 持续时长 |
eg : ping -c 1 -w 1 192.168.1.28
4、文件—设备
序号 | 路径 | 含义 |
---|---|---|
1 | /dev/fd0 | 屏幕 |
2 | /dev/null | 无设备 |
5、获取时间
shell中获取时间
time1=$(date)
echo $time1
#!bin/bash
time2=$(date "+%Y%m%d%H%M%S")
echo $time2
#!bin/bash
time3=$(date "+%Y-%m-%d %H:%M:%S")
echo $time3
#!bin/bash
time4=$(date "+%Y.%m.%d")
echo $time4
#Y显示4位年份,如:2018;y显示2位年份,如:18。
#m表示月份;M表示分钟。
#d表示天;D则表示当前日期,如:1/18/18(也就是2018.1.18)。
#H表示小时,而h显示月份。
#s显示当前时间戳,单位为毫秒;S显示当前秒钟,单位为秒。
linux时间戳转换
date -d @时间戳
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ak0RrP5U-1689168259784)(https://note.youdao.com/yws/res/3430/WEBRESOURCEd1e4d0c7ec39cd57abdeee596dc576b0)]
习题:
1、定义如下变量
name=‘zhang’ sex=‘m’ age=20
name=‘zhang’ sex=‘m’ age=20
2、输出
my name is ***,my sex is *,my age is ***.
echo my name is ${name},my sex is ${sex},my age is ${age}.
3、输入:姓名,姓别,身高并输出
#!/bin/bash
read -p "name: " name
read -p "sex: " sex
read -p "tall: " tall
echo name is ${name} ,sex is ${sex},tall is ${tall}