什么是shell?
在计算器科学中, shell就是一个命令解释器
shell是位于操作系统和应用程序之间, 是他们二者之间最主要的接口.
shell负责把应用程序的输入命令信息解释给操作系统, 将操作系统指令处理后的结果解释给应用程序.
# 查看当前系统默认的shell类型
echo $SHELL
# 查看当前系统环境支持的shell
cat /etc/shells
shell脚本
当可执行的linux命令或语句不在终端执行, 而是通过一个文件执行时, 我们称之为shell脚本
shell脚本后缀是.sh
vi创建一个新文件vi xx.sh
, 内容如下
#!/bin/bash
echo "hello" # 输出
s="world" # 赋值(注意=号前后不能有空格)
echo $s # 打印变量s的内容
保存之后, chmod +x 添加执行权限, 输入 ./xx.sh
运行, 输出
root@DESKTOP-0GN45AJ:/mnt/c/Users/admin/Desktop/shell# ./xx.sh
hello
world
开头的#!
字符又称为幻数, 在执行bash脚本的时候, 内核会根据#!
后的解释器来确定该用那个程序解释这个脚本的内容.
注意: 这一行必须写在第一行, 如果不是第一行则为脚本注释
注释
# 单行注释
# 多行注释有两种方法::<<! ... ! 和 :<<字符 ... 字符
#!/bin/bash
:<<! echo 'hello'
echo 'world'
!
echo 'nihao'
老版本的shell有严重的安全漏洞, 比如破壳漏洞. 利用此漏洞攻击者能获取服务器的控制权. 所以建议升级bash到最新的版本, centos升级的方法为
yum -y update bash
rpm -qa bash
centos和ubuntu默认的shell都是bash, 在写shell脚本的时候, 开头可以不写#!/bin/bash
, 也会交给bash解释, 成功执行, 但是为了避免执行的结果不是你想要的, 最好还是指定解释器.
不管什么脚本, 最好都应该加上相应的开头解释器标识, 这是一个良好的编程习惯.
shell的脚本执行
shell脚本执行时, 会先查找系统环境变量, ENV, 该变量指定了指定环境文件, 加载顺序通常为
/etc/profile ~/.bash_profile ~/.bashrc /etc/bashrc ...
加载环境变量后, shell就会执行shell脚本中的内容
shell脚本从上到下, 从左到右的顺序执行每一条语句, 如果有嵌套, 会执行子脚本里的语句.
没有权限的脚本不能直接被执行, 给脚本添加执行权限后, 就可以执行了
chmod u+x xx.sh
脚本本身没执行权限或者没有解释器的可以使用bash 文件名
执行
shell脚本开发的基本规范
shell脚本的开发规范非常重要, 虽然可以不遵守, 但是当许多人协作开发的时候, 互相遵守规范就显得很重要了.
即使是一个人开发, 最好也采取固定的一套方案, 这样的脚本会更易读, 更易于后期维护.
shell脚本的第一行是指定脚本解释器
shell脚本的开头会加版本, 版权等信息 可修改
~/.vimrc
配置文件vim编辑文件时自动加上以上信息 脚本名, 功能, 编写时间, 编写人, 联系方式等在shell脚本中尽量不要使用中文(不限于注释)
如果非要使用中文, 可以执行字符集如`export LANG="zh_CN.UTF-8"
shell脚本的命名应该以
.sh
为扩展名, 取名最好能表明脚本的功能shel脚本应该存放在固定的路径下
shell的变量
shell变量包括两个部分
变量名 不变
变量值 变化
变量名就是存放变量值的容器,容器不变但里边的东西可变
shell中的变量分类
1. 本地变量
2. 全局变量
3. 内置变量
普通变量的定义方式
变量名=变量值 变量值必须是连续的, 不能有空格, 不能有特殊字符
age=123 echo $age #输出 123
变量名='变量值' 变量值可以是不连续的, 能用空格 特殊字符原样, 引号里是什么就是什么
age=123 name_second='$age' echo $name_second #输出 $age
变量名="变量值" 值可以不连续
如果值中使用已经定义的变量, 会先调用在赋值
age=123 name_second='$age' age_second="$age" echo $age_second #输出 123
命令变量的定义方式
1. 变量名=``命令``
2. 变量名=$(命令)
执行顺序: 先运行命令, 将命令执行结果赋值给变量名
全局变量
系统所有环境都可以使用的变量
查看方法: env命令
定义方法:
1. 分步的方式
定义一个本地变量
变量名=变量值
然后声明为全局变量
export 变量名
2. 同时定义
1. export 变量名=变量值
内置变量
内置变量是bash命令内部已经定义好的变量, 可以直接使用不需要定义
使用方法
- 和shell脚本相关的内置变量
$0 获取当前脚本名称
$n 获取当前脚本获取到的第n个参数(大于9时要用大括号括起来例如${10})
$? 获取上一次命令执行情况, 0表示成功
$$ 脚本运行时使用的进程号
$@ 获取所有的参数
- 和默认值相关的内置变量
var_name=$1
${var_name:-default}
default表示默认值, 如果没有输入参数, default将会被使用
var_name=$1
${var_name:+default}
将会无视输入参数, 直接输出设定好的默认值
- 和字符串相关的内置变量
# 截取
${var_name:start:n}
${var_name:0-n}
# var_name是字符串变量名
# start表示的截取的起始位置
# start正数 从开始截取
# start为0-n 从结尾开始截取
示例:
${str:0:5} 从第 1 个字符开始,截取 5 个字符
${str::5} 从第 1 个字符开始,截取 5 个字符
${str:5:5} 从第 6 个字符开始,截取 5 个字符
${str:5} 从第 6 个字符开始,截取后面所有的字符
${str:0-6} 从倒数第 6 个字符开始,截取后面所有的字符
${str:0-6:2} 从倒数第 6 个字符开始,截取之后的 2 个字符
评论 (0)