Shell编程_01

shell编程:
shell就是在操作系统和应用程序之间的一个命令翻译工具。

命令行式shell
windows系统:
cmd.exe 命令提示字符

linux系统:
sh / csh / ksh / bash / …
我们常说的shell是命令行式的shell,在工作中常用的是linux系统下的bash。

shell脚本定义:
当可执行的Linux命令或语句不在命令行状态下执行,而是通过一个文件执行时,我们称文件为shell脚本。

shell脚本就是shell编程的一种具体实现
脚本:script

  1. 创建脚本
    脚本创建工具:
    创建脚本的常见编辑器是 vi/vim.

脚本命名
shell脚本的命名简单来说就是要有意义,方便我们通过脚本名,来知道这个文件是干什么用的。

脚本内容:
各种可以执行的命令

注释内容:
单行注释:
除了首行的#不是注释外,其他所有行内容,只要首个字符是#,那么就表示该行是注释
#!/bin/bash
echo ‘1’
# echo ‘2’ # 这一行就表示注释
echo ‘3’

多行注释:
多行注释有两种方法:
:<<! … ! 和 :<<字符 … 字符
#!/bin/bash
echo ‘1’
:<<! echo ‘2’
echo ‘3’
echo ‘4’
!
echo ‘5’

shell执行的方式:
bash 脚本名

执行说明:
脚本文件本身没有可执行权限或者脚本首行没有命令解释器时使用的方法,我们推荐用bash执行。

  1. 脚本开发规范
    1、脚本命名要有意义,文件后缀是.sh
    2、脚本文件首行是而且必须是脚本解释器
    #!/bin/bash
    3、脚本文件解释器后面要有脚本的基本信息等内容
    脚本文件中尽量不用中文注释;
    尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰
    常见的注释信息:脚本名称、脚本功能描述、脚本版本、脚本作者、联系方式等
    4、脚本文件常见执行方式:bash 脚本名
    5、脚本内容执行:从上到下,依次执行
    6、代码书写优秀习惯;
    1)成对内容的一次性写出来,防止遗漏。
    如:()、{}、[]、’’、``、""
    2)[]中括号两端要有空格,书写时即可留出空格[ ],然后再退格书写内容。
    3)流程控制语句一次性书写完,再添加内容
    7、通过缩进让代码易读;(即该有空格的地方就要有空格)

  2. 本地变量
    本地变量:在当前系统的某个环境下才能生效的变量,作用范围小。
    本地变量包含两种:普通变量和命令变量

3.1 普通变量:
普通变量的定义方式有如下三种,接下来我们就分别说一下这三种方式:
方式一:
变量名=变量值
重点:
变量值必须是一个整体,中间没有特殊字符
方式二:
变量名=‘变量值’
重点:
我看到的内容,我就输出什么内容
方式三:
变量名=“变量值”
重点:
如果变量值范围内,有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,重新赋值给变量B
习惯:
数字不加引号,其他默认加双引号
3.2 命令变量(熟练)
命令变量有两种定义方式,接下来我们就来介绍一下这两种方式

定义方式一:
变量名=命令
注意:
` 是反引号

定义方式二:
变量名= ( ) 1 (命令) 执行流程: 1、执行``或者 ()范围内的命令
2、将命令执行后的结果,赋值给新的变量名A

  1. 全局变量
    全局变量:在当前系统的所有环境下都能生效的变量。

补充:
全部变量在当前的整个 Shell 会话及其派生出来的任意子shell中都有效,另外需要注意的是,环境变量只能向下传递而不能向上传递,即“传子不传父”。
每个独立的Shell 会话都有自己的作用域,彼此之间互不影响。

查看全局变量命令
可以通过命令查看环境变量
env 只显示全局变量

定义全局变量
方法一:
变量=值
export 变量
方法二:(最常用)
export 变量=值

  1. 变量查看和取消
    查看变量:
    方式一:
    / 使 &quot; 变量名 场景: 私下里,在命令行/脚本中使用 图省事 方式二: &quot; 变量名"
    场景:
    私下里,在命令行/脚本中使用
    图省事
    方式三:
    ${变量名}
    场景:
    echo " dsa dsafsa dsafsa f &quot; 使 &quot; {变量名} f &quot; 使用频率较高 方式四: &quot; {变量名}"
    eg:
    “${ a }”
    场景:
    标准使用方式

取消变量
unset 变量名

shell内置变量
我们之前学习的本地变量,全局变量都是需要通过定义,然后才能实现相应功能的,那么有没有一些变量我们可以直接拿过来使用实现某种具体的功能呢?有,这就是shell内置变量
和脚本文件有关
符号 意义
$0 获取当前执行的shell脚本文件名,包括脚本路径
n s h e l l n n = 1..9 n 0 n 9 n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来 {10}
$# 获取当前shell命令行中参数的总个数
$? 获取执行上一个指令的返回值(0为成功,非0为失败)

重点
内置变量演示效果:
$0 获取脚本的名称
示例:
#!/bin/bash
# 获取脚本的名称
echo “我脚本的名称是: file.sh
echo “我脚本的名称是:$0”

$# 获取当前脚本传入参数的数量
$n 获取当前脚本传入的第n个位置的参数
示例:
#!/bin/bash
# 获取当前脚本传入的参数数量
echo “当前脚本传入的参数数量是: $#”

# 获取指定位置的参数
echo “第一个位置的参数是: $1”
echo “第二个位置的参数是: $2”
echo “第三个位置的参数是: $3”
echo “第四个位置的参数是: $4”
$? 获取文件执行或者命令执行的返回状态值
示例:
# bash nihao
bash: nihao: No such file or directory
# echo $?
127
# ls
file1.sh num.sh test.sh weizhi.sh
# echo $?
0

  1. 字符串精确截取
    格式:${变量名:起始位置:截取长度}

示例:
${file:0:5} 从第1个字符开始,截取5个字符
${file::5} 从第1个字符开始,截取5个字符
${file:5:5} 从第6个字符开始,截取5个字符
${file:5} 从第6个字符开始,截取后面所有的字符
${file:0-5} 从倒数第5个字符开始,截取后面所有的字符
${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符

默认值相关
场景一:
变量a如果有内容,那么就输出a的变量值
变量a如果没有内容,那么就输出默认的内容
格式:
${变量名:-默认值}

套餐示例:
如果我输入的参数为空,那么输出内容是 “您选择的套餐是: 套餐 1”
如果我输入的参数为n,那么输出内容是 “您选择的套餐是: 套餐 n”
#!/bin/bash
# 套餐选择演示
a="$1"
echo “您选择的套餐是: 套餐 ${a:-1}”

场景二:
无论变量a是否有内容,都输出默认值
格式:
${变量名+默认值}
场景示例:
不管我说国家法定结婚年龄是 多少岁,都输出 国家法定结婚年龄(男性)是 22 岁
#!/bin/bash

默认值演示示例二

a="$1"
echo “国家法定结婚年龄(男性)是 ${a+22} 岁”

SHELL 进阶

  1. 表达式
    要使Shell脚本程序具备一定的“逻辑能力”,面临的第一个问题就是:区分不同的情况以确定执行何种操作,下面我们就来学习解决这个问题—测试语句
    1.1测试语句
    Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0,表示成功,值为其他时,表示失败。使用专门的测试工具—test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值0为成立)

测试语句形式
A: test 条件表达式
B: [ 条件表达式 ]
格式注意:
以上两种方法的作用完全一样,后者为常用。
但后者需要注意方括号[、]与条件表达式之间至少有一个空格。
test跟 [] 的意思一样
条件成立,状态返回值是0
条件不成立,状态返回值是1

操作注意:
[]两侧为什么要有空格
root@ubuntu:~# [1 = 1 ]
[1: command not found
可以看到:
两侧没有空格,就会报错,为什么呢?因为你不合规范

1.2 条件表达式
我们这部分内容主要是介绍,测试语句中的 [ 条件表达式 ] 这一部分,测试的结果使用 echo $? 来查看

逻辑表达式
逻辑表达式一般用于判断多个条件之间的依赖关系。
常见的逻辑表达式有: && 和 ||

&&
命令1 && 命令2
如果命令1执行成功,那么我才执行命令2 – 夫唱妇随
如果命令1执行失败,那么命令2也不执行
示例:
# [ 1 = 1 ] && echo "条件成立"
条件成立
# [ 1 = 2 ] && echo "条件成立"

||
命令1 || 命令2
如果命令1执行成功,那么命令2不执行 – 对着干
如果命令1执行失败,那么命令2执行
示例:
# [ 1 = 2 ] || echo "条件不成立"
条件不成立
# [ 1 = 1 ] || echo "条件不成立"

1.3 文件表达式
-f 判断输入内容是否是一个文件
示例:
# [ -f weizhi.sh ] && echo "是一个文件"
是一个文件
# [ -f weizhi.sddh ] || echo "不是一个文件"
不是一个文件

-d 判断输入内容是否是一个目录
示例:
# [ -d weizhi.sddh ] || echo "不是一个目录"
不是一个目录

# mkdir nihao
# [ -d nihao ] && echo "是一个目录"
是一个目录

-x 判断输入内容是否可执行
示例:
# [ -x age.sh ] || echo "文件没有执行权限"
文件没有执行权限
# [ -x test.sh ] && echo "文件有执行权限"
文件有执行权限

1.4 数值操作符
主要根据给定的两个值,判断第一个与第二个数的关系,如是否大于、小于、等于第二个数。常见选项如下:
n1 -eq n2 相等 equal
n1 -gt n2 大于
n1 -ge n2 大于等于
n1 -lt n2 小于
n1 -le n2 小于等于
n1 -ne n2 不等于 not equal

1.5 字符串比较
str1 == str2 str1和str2字符串内容一致
str1 != str2 str1和str2字符串内容不一致,!表示相反的意思
实践
判断字符是否内容一致
root@ubuntu:~# [ a == a ]
root@ubuntu:~# echo $?
0
root@ubuntu:~# [ a != a ]
root@ubuntu:~# echo $?
1

1.6 计算表达式
定义:
计算表达式,简单来说就是对具体的内容进行算数计算

格式:
方式一:
$(()) $(( 计算表达式 ))
方式二:
let let 计算表达式

注意:
$(())中只能用±*/和()运算符,并且只能做整数运算

( ( ) ) a = (())演示效果 格式:a= ((变量名a+1))
注意:
表达式范围内,空格不限制
计算示例
root@ubuntu:~# echo $((100/5))
20

let演示效果
格式:let 变量名a=变量名a+1
注意:
表达式必须是一个整体,中间不能出现空格等特殊字符
let示例
root@ubuntu:~# i=1
root@ubuntu:~# let i=i+7
root@ubuntu:~# echo $i
8

2 linux常见符号
接下来我们来介绍几个linux的场景符号:
重定向符号、管道符、其他符号
2.1 重定向符号
在shell脚本中有两种常见的重定向符号 > 和 >>

符号
作用:
表示将符号左侧的内容,以覆盖的方式输入到右侧文件中
演示:
查看文件内容
admin-1@ubuntu:~$ cat file.txt
nihao
使用重定向符号给文件中增加内容
admin-1@ubuntu:~$ echo “file1.txt” > file.txt
再次查看文件内容
admin-1@ubuntu:~$ cat file.txt
file1.txt

符号
作用:

表示将符号左侧的内容,以追加的方式输入到右侧文件的末尾行中
演示:
查看文件内容
admin-1@ubuntu:~$ cat file.txt
file1.txt
使用重定向符号给文件中增加内容
admin-1@ubuntu:~$ echo “file2.txt” >> file.txt
再次查看文件内容
admin-1@ubuntu:~$ cat file.txt
file1.txt
file2.txt

2.2 管道符 |
定义:
| 这个就是管道符,传递信息使用的

使用格式:
命令1 | 命令2
管道符左侧命令1 执行后的结果,传递给管道符右侧的命令2使用

命令演示:
查看当前系统中的全局变量SHELL
admin-1@ubuntu:~$ env | grep SHELL
SHELL=/bin/bash

2.3 其他符号
后台展示符号 &
定义:
& 就是将一个命令从前台转到后台执行
使用格式:
命令 &
命令演示:
admin-1@ubuntu:~# sleep 4
界面卡住4秒后消失
admin-1@ubuntu:~# sleep 10 &
[1] 4198
admin-1@ubuntu:~# ps aux | grep sleep
root 4198 0.0 0.0 9032 808 pts/17 S 21:58 0:00 sleep 10
root 4200 0.0 0.0 15964 944 pts/17 S+ 21:58 0:00 grep --color=auto sleep

Ctrl+Z 让当前任务转入到后台并停止
jobs 查看后台任务
fg 让后台进程转入到前台执行
bg 让后台停止的任务继续在后台执行
2.4 全部信息符号 2>&1
符号详解:
1 表示正确输出的信息
2 表示错误输出的信息
2>&1 代表所有输出的信息
符号示例
标准正确输出示例
cat nihao.txt 1>> zhengque
标准错误输出示例
dsfadsfadsfa 2>> errfile

综合演练示例
脚本内容
#!/bin/bash
echo ‘下一条错误命令’
dsfsafsafdsa
脚本执行效果
admin-1@ubuntu:~# bash ceshi.sh
下一条错误命令
ceshi.sh: line 3: dsfsafsafdsa: command not found
1 和 2 综合演练
admin-1@ubuntu:~# bash ceshi.sh 1>> ceshi-ok 2>> ceshi-err
admin-1@ubuntu:~# cat ceshi-ok
下一条错误命令
admin-1@ubuntu:~# cat ceshi-err
ceshi.sh: line 3: dsfsafsafdsa: command not found
全部信息演练
admin-1@ubuntu:~# bash ceshi.sh >> ceshi-all 2>&1
admin-1@ubuntu:~# cat ceshi-all
下一条错误命令
ceshi.sh: line 3: dsfsafsafdsa: command not found

linux系统垃圾桶
/dev/null 是linux下的一个设备文件,
这个文件类似于一个垃圾桶,特点是:容量无限大

猜你喜欢

转载自blog.csdn.net/weixin_44786482/article/details/88757107
今日推荐