Shell编程以及一些概念

Shell编程

一、Shell概念介绍

1、认识Shell

Shell解析器:解析Shell脚本,查看:

cat /etc/shells

CentOS默认的解析器是**bash**,打印系统默认的Shell解析器

echo $SHELL
①、Shell是什么

是命令,类似Windows的dos命令;

又是一门程序设计语言,里面含有变量、函数、逻辑控制语句等

②、Shell脚本是什么

Shell脚本是一个文本文件,里面可以编写Shell命令或进行编程,形成一个可重用执行的脚本文件

③、Shell脚本的作用

通过Shell编程提高对Linux系统的管理工作效率

④、Linux系统默认的Shell解析器

/bin/bash


2、编写、执行Shell脚本

①、Shell脚本编写规范
  • 文件后缀名.sh结尾

  • 首行需要设置shell解析器类型,如下:

    #!/bin/bash
    

    含义:设置当前shell脚本文件采用bash解析器

  • 注释:

    • 单行注释

      # 注释内容
      
    • 多行注释

      :<<!
      注释行1
      注释行2
      !
      
②、Shell脚本HelloWorld
  1. 编写HelloWorld脚本文件

    touch HelloWorld.sh
    vim HelloWorld.sh
    

    a进入编辑模式,HelloWorld.sh内容如下

    #!/bin/bash
    echo "Hello,World"
    

    :wq保存

  2. 执行脚本文件HelloWorld.sh

    • shell解析器执行

      sh HelloWorld.sh
      
    • bash解析器执行

      bash HelloWorld.sh
      
    • 仅路径执行:需要脚本文件具有可执行权限

      # 添加可执行权限
      chmod a+x HelloWorld.sh
      # 自我执行,前面的./代表当前路径
      ./HelloWorld.sh
      

三种执行方式的区别

sh或bash执行通过直接使用shell解析器执行,不需要脚本文件具有可执行权限;

仅路径方式自我执行脚本文件,需要可执行权限


3、多命令处理

需求:

已知目录/root/feng目录,执行batch.sh脚本,实现在/root/feng/目录下创建一个one.txt文件,在one.txt文件中增加内容"Hello, Shell"。

实现:

# 创建feng目录
mkdir feng
# 创建并编辑batch.sh脚本文件
vim batch.sh

batch.sh内容:

#!/bin/bash
touch /root/feng/one.txt
echo "Hello, Shell" >> /root/feng/one.txt

输出字符串数据到文件:echo "字符串" >> 文件

# 执行batch.sh
sh batch.sh
# 查看one.txt文件是否生成
ls -l /root/feng/
# 查看one.txt文件内容
cat /root/feng/one.txt

二、Shell变量

1、环境变量

①、 系统环境变量是什么?

是系统提供的环境变量,通过加载shell配置文件中的变量数据,共享给shell程序使用

②、环境变量的分类

  • 系统及环境变量

    shell环境加载全局配置文件中定义的变量

  • 用户级环境变量

    shell环境加载个人配置文件中定义的变量

③、env和set的区别

  • env:查看系统环境变量
  • set:查看系统环境变量、自定义变量、函数

④、常用的环境变量

变量名称含义
PATH存放命令的目录路径,与Windows的环境变量PATH一样
LANG查询系统的字符集
HISTFILF查询当前用户的历史执行命令列表

2、自定义局部变量

① 自定义局部变量
  1. 定义自定义局部变量

    var_name=value # 注意=前后不要有空格
    
  2. 使用自定义局部变量

    # 直接使用
    echo $var_name
    # 字符串拼接使用
    echo my name is ${var_name}123
    
  3. 删除自定义局部变量

    unset $var_name
    
② 自定义常量(只读变量)
  1. 定义只读变量:(不可修改值)

    readonly var_name
    
③ 自定义全局变量

父子Shell环境:

有两个Shell脚本文件A.sh和B.sh

在A.sh中执行了B.sh的脚本文件,就称A.sh为父Shell环境,B.sh为子Shell环境。

自定义全局变量:

在父Shell环境中定义全局变量,子Shell环境也能使用

自定义全局变量语法:

export var_name1 var_name2

案例:

  1. 创建2个脚本文件demo1.sh和demo2.sh
  2. 编辑demo1.sh
    • 命令1:定义全局变量VAR_NAME
    • 命令2:执行demo2.sh的脚本文件
  3. 编辑demo2.sh
    • 输出全局变量VAR_NAME
  4. 执行demo2.sh文件
#1. 创建2个脚本文件demo1.sh和demo2.sh
touch demo1.sh demo2.sh
#2. 编辑demo1.sh
vim demo1.sh

demo1.sh内容

#!/bin/bash
#- 命令1:定义全局变量VAR_NAME
export VAR_NAME="GO Spurs GO"
#- 命令2:执行demo2.sh的脚本文件
sh demo2.sh

demo2.sh内容

#!/bin/bash
#- 输出全局变量VAR_NAME
echo $VAR_NAME

执行demo1.sh: sh demo1.sh

④ 自定义变量总结

1、定义和修改:var_name=value

2、查询或使用:${var_name}$var_name

3、删除:unset varname


3、特殊变量

  • $n:用于接收脚本文件执行时传入的参数
  • $#:获取所有输入参数的个数。
  • $*:获取所有输入参数
  • $@:获取所有输入参数
  • $?:获取上一个shell命令执行的退出状态码,或者是函数的返回值
  • $$:获取当前Shell环境的id号

$n

  • $0:用于获取当前脚本文件的名称
  • $1~$9:代表第1个到第9个输入参数
  • ${数字}:代表第10个及以上的输入参数

$*$@的区别:

  • 不使用双引号引起来,功能一样
    获取所有的输入参数,格式为:$1 $2 ...
  • 使用双引号引起来
    $*:获取的所有参数拼接成一个字符串,格式为:"$1 $2 ... $n"
    $@:获取一组参数列表对象,格式为:"$1" "$2""$n"

执行脚本文件传入参数

sh 脚本文件 参数1 参数2 ···

循环语法:

for var_name in 列表变量
do						# 循环开始
	echo $var_name		# 循环体
done					# 循环结束

需求:

创建demo.sh, 打印脚本文件名字,第一个参数,第二个参数,第十个参数,所有参数个数,所有输入参数、逐行打印参数。

实现:

  • 创建demo.sh:vim demo.sh
  • demo.sh
#!/bin/bash
# 打印脚本名字
echo 打印脚本名字:$0
# 打印第一个参数
echo 打印第一个参数:$1
# 打印第二个参数
echo 打印第二个参数:$2
# 打印第十个参数
echo 打印第十个参数(不带花括号):$10
echo 打印第十个参数(带花括号):${10}

# 打印所有参数个数
echo 打印所有参数个数:$#

# 打印所有输入参数
echo 打印所有输入参数:"$*"
# 遍历参数列表
echo 遍历参数列表:
for item in "$@"
do
	echo $item
done
  • 执行demo.sh:sh demo.sh 一 二 三 四 五 六 七 八 九 十
  • 查看上一个shell命令的执行结果:echo $?
  • 查看当前Shell环境的id号:echo $$

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值