shell脚本基础

1、脚本:将有限的shell命令放到文件中。
2、作用:自动化执行指令
3、实质:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析指令并执行(它不需要编译)
4、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解释器有:shashbash
2、查询系统默认的解释器:echo $SHELL
3、不加#!系统则使用默认解释器

4、语言

1、数据

shell只有唯一数据类型:字符串

1、字符串常量

Col1Col2
‘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

序号表达形式现象
1seq LAST从1累加1打印到从1循环打印到LAST
2seq FIRST LAST从FIRST累加1打印到从1循环打印到LAST
3seq 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:每一个进程(正在执行的程序)都有文件描述符表(数组),该文件描述符指向文件或文件设备。

序号表达形式
1command1> 文件添加内容
2command1>> 文件添加内容追加到文件末尾

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}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值