Linux Shell编程学习笔记 01

易小灯塔
2018-02-17 / 0 评论 / 877 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2018年02月17日,已超过2473天没有更新,若内容或图片失效,请留言反馈。

什么是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脚本的开发规范非常重要, 虽然可以不遵守, 但是当许多人协作开发的时候, 互相遵守规范就显得很重要了.

即使是一个人开发, 最好也采取固定的一套方案, 这样的脚本会更易读, 更易于后期维护.

  1. shell脚本的第一行是指定脚本解释器

  2. shell脚本的开头会加版本, 版权等信息 可修改~/.vimrc配置文件vim编辑文件时自动加上以上信息 脚本名, 功能, 编写时间, 编写人, 联系方式等

  3. 在shell脚本中尽量不要使用中文(不限于注释)

    如果非要使用中文, 可以执行字符集如`export LANG="zh_CN.UTF-8"

  4. shell脚本的命名应该以.sh为扩展名, 取名最好能表明脚本的功能

  5. shel脚本应该存放在固定的路径下

shell的变量

shell变量包括两个部分

变量名	  不变
变量值     变化 

变量名就是存放变量值的容器,容器不变但里边的东西可变

shell中的变量分类

1. 本地变量
2. 全局变量
3. 内置变量 

普通变量的定义方式

  1. 变量名=变量值 变量值必须是连续的, 不能有空格, 不能有特殊字符

    age=123
    echo $age
    #输出
    123 
  2. 变量名='变量值' 变量值可以是不连续的, 能用空格 特殊字符原样, 引号里是什么就是什么

    age=123
    name_second='$age'
    echo $name_second
    #输出
    $age 
  3. 变量名="变量值" 值可以不连续

    如果值中使用已经定义的变量, 会先调用在赋值

    age=123
    name_second='$age'
    age_second="$age"
    echo $age_second
    #输出
    123 


命令变量的定义方式

1. 变量名=``命令``
2. 变量名=$(命令) 

执行顺序: 先运行命令, 将命令执行结果赋值给变量名

全局变量

系统所有环境都可以使用的变量

查看方法: env命令

定义方法:

1. 分步的方式
		定义一个本地变量
		变量名=变量值
   然后声明为全局变量
		export 变量名

2. 同时定义
   1. export 变量名=变量值 


内置变量

内置变量是bash命令内部已经定义好的变量, 可以直接使用不需要定义

使用方法

  1. 和shell脚本相关的内置变量
$0	获取当前脚本名称
$n	获取当前脚本获取到的第n个参数(大于9时要用大括号括起来例如${10})
$?	获取上一次命令执行情况, 0表示成功
$$	脚本运行时使用的进程号
$@	获取所有的参数 
  1. 和默认值相关的内置变量
var_name=$1
${var_name:-default}
default表示默认值, 如果没有输入参数, default将会被使用

var_name=$1
${var_name:+default}
将会无视输入参数, 直接输出设定好的默认值 
  1. 和字符串相关的内置变量
# 截取
${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 个字符 

image-20201107154924278

0

评论 (0)

取消