Linux里 Shell脚本基础及变量



一 Shell 脚本概述



1.1 shell 脚本的概念

  • 将要执行的命令按顺序保存到一个文本文件
  • 要给该文件可执行权限
  • 可以结合各种Shell 控制语句以完成更复杂的操作



1.2 Shell 脚本应用场景

  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行
  • ......



1.3 Shell 的作用

Shell ——命令解释器,介于系统内核与用户之间,一种被称为解释性语言或者脚本语言的计算机语言。充当"翻译官"的作用

Linux 系统中运行的 一种特殊程序,用户登录Linux 系统时,自动加载一个Shell 程序

Linux 系统棕默认使用的Shell程序是 Bash ,文件位于 /bin/bash

不同Shell 的内部指令,运行环境会有区别

image-20210705135740433



1.4 Shell 基本的构成

  • 脚本声明
  • 注释信息
  • 可执行语句

[root@host102 ~]# vim test.sh

image-20210705140706339

[root@host102 ~]# chmod +x test.sh 
[root@host102 ~]# ll test.sh 
-rwxr-xr-x 1 root root 42 7月   5 14:07 test.sh

image-20210705141048686



1.5 脚本的执行

  • bash 加 脚本
  • 文件名直接执行(直接脚本的绝对路径或者相对路径执行)
  • source 或者 点 "." 加脚本执行

image-20210705141431968



1.6 脚本执行方法的区别

bash +脚本 : 新开了一个bash 环境,然后在这个新的bash 环境中运行脚本内程序

文件名直接执行: 这个方法是将脚本作为一个可执行程序,所以,要写脚本的绝对路径或者相对路径。由于脚本本身作为可执行程序,所以,会创建名为脚本名(test.sh) 的子进程

source或者点 " . ": 这两个命令都是在当前 shell 环境下,使用当前的解释器读取并执行命令,不会新开一个shell 环境或者 其他的子进程。由于这两个命令都是将 脚本作为参数,所以,不需要脚本有 执行权限x



将之前的脚本内容修改,加上 'sleep 1000'

[root@host102 ~]# vim test.sh
#!/bin/bash
#This a test file

sleep 1000
echo "hello world"

image-20210705142019139



先psree 查看进程树

[root@host102 ~]# pstree

image-20210705142357532



然后运行脚本,再打开另一个终端 查看进程树

(1)[root@host102 ~]# bash test.sh

image-20210705142653033



(2) [root@host102 ~]# ./test.sh

image-20210705143015625



(3) [root@host102 ~]# source test.sh

image-20210705143144058

使用type 命令查看 source" . "

[root@host102 ~]# type source .

image-20210705143835363



1.7 重定向操作

1.7.1 交互式硬件设备

  • 标椎输入: 从该设备接收用户输入的数据
  • 标椎输出:通过该设备向用户输出数据
  • 标椎错误输出:通过该设备报告执行出错信息
类型 设备文件 文件描述编号 默认设备
标椎输入 /dev/stdin 0 键盘
标椎输出 /dev/stdou 1 显示器
标椎错误输出 /dev/stderr 2 显示器

1.7.2 重定向操作

类型 操作符 用途
重定向输入 < 从指定的文件读取,而不是从键盘输入
覆盖重定向输出 > 或者 1> 将正确的输出的结果保存到指定文件(覆盖原有内容)
追加重定向输出 >> 或者 1>> 将正确的输出的结果保存到指定文件(追加在文件尾部)
覆盖标椎错误输出 2> 将错误的输出的结果保存到指定文件(覆盖原有内容)
追加标椎错误输出 2>> 将错误的输出的结果保存到指定文件(追加在文件尾部)
覆盖混合输出 &> 将标准输出,标准错误的内容保存到同一文件(覆盖原有内容)
追加混合输出 &>> 将标准输出,标准错误的内容保存到同一文件(追加在文件尾部)

补充:

操作符 用途
>&2 或者 1>&2 将标准输出重定向到标准错误(即,让正确输出可以被 2> 收集)
2>&1 将标准错误输出重定向到标椎输出(即,让错误的输出可以被 > 收集)

1,重定向输入

[root@host102 opt]# cat < a abc

虽然 cat < a 和 cat a 结果是一样的,但是其表示意义不一样

image-20210705152142575



2,标准重定向输出

如果前面命令返回值为0(即,命令正确),则将结果重定向输出到指定文件

返回值: 命令运行正确,则返回值为0 .命令运行错误,则返回非 0 值。可以用echo $? 查看上一条命令的返回值

image-20210705155738578



3,标椎错误输出

接收错误输出的信息(命令返回值为 非0 值),重定向到指定文件

image-20210705161040844



4.混合输出

将所有输出信息重定向到指定文件

image-20210705162549762



5 , 1>&2 和 2>&1

2>&1 把标准错误输出重定向到标准输出

image-20210705163516112



1>&2 把标准输出重定向到标准错误

image-20210705164006293



1.8 管道操作符号

管道操作符号 " | " ,将左侧命令输出结果,作为右侧命令的处理对象

cmd 1 | cmd 2 [.....| cmdn]

[root@host102 opt]# cat /etc/passwd | wc -l 
40

管道符号 加上 xargs ,可以将前面的结果作为参数传递给后面

[root@host102 opt]# ls | rm -rf 
[root@host102 opt]# ls
123.txt  abc  rh
[root@host102 opt]# ls | xargs rm -rf 
[root@host102 opt]# ls

image-20210705164915830



二:Shell 脚本变量



2.1 变量概述

2.1.1 变量的定义

变量就是会变的量。可以通过变量名得到变量值。在内存上开辟一个记录数据的空间,给它起个名字,如name,num 等,这些就是变量名。而存放在该空间的数据就是变量的值。

2.1.2 变量的格式

变量名=变量值

2.1.3 变量名命名规则:

  • 变量名必须是以字母或下划线开头,名字中间只能由字母,数字,下划线"_" 组成,不能有小数点,特殊字符,空格,标点符号等。
  • 变量名的长度不得超过255 个字符
  • 变量名在有效范围内必须是唯一的。
  • 变量名不能和系统命令,系统变量等冲突
  • 变量名可以将开头字母打下,以防和系统命令等冲突

2.1.4 查看变量名

可以用echo $变量名 ,查看变量的值

[root@host102 opt]# name=lisi
[root@host102 opt]# echo $name
lisi

image-20210705171403663




使用set 查看当前shell 里所有的变量

[root@localhost ~]# set
[root@localhost ~]# set | grep '^a'
a=1234

2.2 自定义变量

设置变量格式:

变量名=变量值

取消变量设置格式:

set 变量名

[root@localhost ~]# a=1234
[root@localhost ~]# echo $a
1234
[root@localhost ~]# unset a
[root@localhost ~]# echo $a

[root@localhost ~]# 

image-20210707145847395

引号的使用

双引号 "":允许通过$ 符号引用其他变量值,不取消特殊符号的释义

单引号 '':禁止引用其他变量值,$视为普通字符,取消特殊符号的释义

反撇号``:命令替换,提取命令执行后的输出结果。作用与$() 相同

双引号:

[root@host102 opt]# myname=zhangsan
[root@host102 opt]# yourname=lisi
[root@host102 opt]# name="$myname,$yourname"
[root@host102 opt]# echo $name
zhangsan,lisi

image-20210705172407520



单引号:

[root@host102 opt]# myhost=nanjing
[root@host102 opt]# youhost=beijing
[root@host102 opt]# host='$myhost,$yourhost'
[root@host102 opt]# echo $host
$myhost,$yourhost

image-20210705172759243



反撇号:

[root@host102 opt]# myhostname=`hostname`
[root@host102 opt]# echo myhostname
myhostname

image-20210705173212742



2.3 从键盘输入内容为变量赋值

read [-p “提示信息”] 变量名

[root@host102 opt]# read -p "input your name:" name
input your name:zhangsan
[root@host102 opt]# echo $name
zhangsan

image-20210705173614918



2.4 设置变量的作用范围

格式:

export 变量名

export 变量名=变量值



局部变量:

直接设置的变量是局部变量,只在当前shell 环境生效,如果重开终端,或者开启一个新的shell 环境,或者登陆其他用户账号,则变量失效

[root@host102 opt]# name=lisi
[root@host102 opt]# echo $name
lisi
[root@host102 opt]# bash
[root@host102 opt]# echo $name

[root@host102 opt]# 

image-20210705174554886



全局变量:

可以在全局都有效的变量,不管是新的bash环境,还是其他用户账号,都会有效

格式1:

[root@host102 opt]# myhost=nanjing 
[root@host102 opt]# echo $myhost
nanjing
[root@host102 opt]# export myhost
[root@host102 opt]# bash
[root@host102 opt]# echo $myhost
nanjing
[root@host102 opt]# 

image-20210705175815265



格式2:

[root@host102 opt]# export yourname=lisi
[root@host102 opt]# echo $yourname
lisi
[root@host102 opt]# bash
[root@host102 opt]# echo $yourname
lisi
[root@host102 opt]# 

image-20210705175531434



2.5 整数变量的运算

2.5.1 expr 进行运算

expr 变量1 运算符 变量2 [运算符 变量3]....

  • 常用运算符
  • 加法运算: +
  • 减法运算: -
  • 乘法运算: *
  • 除法运算: /
  • 求模(取余)运算 : %
[root@host102 opt]# expr 10 + 10 / 2 
15
[root@host102 opt]# expr 10 + 10 % 3
11

image-20210705181449360



[root@host102 opt]# a=10
[root@host102 opt]# b=20
[root@host102 opt]# c=5
[root@host102 opt]# expr $a +  $b  -  $c
25

image-20210705181704093



2.5.2 echo 加$[]

[root@host102 opt]# echo $[ 10 - 2 ]
8
[root@host102 opt]# a=10
[root@host102 opt]# b=20
[root@host102 opt]# echo $[a+b]
30
[root@host102 opt]# 

image-20210705182031843



2.5.3 echo $(( ))

[root@host102 opt]# echo $((10+10))
20
[root@host102 opt]# a=10
[root@host102 opt]# b=20
[root@host102 opt]# echo $((a+b))
30
[root@host102 opt]# echo $((a++))
10

image-20210705182530043



2.6 环境变量

定义: 由系统提前创建,用来设置用户的工作环境

2.6.1设置环境变量

配置文件: /etc/profile , ~/bash_profile

/etc/profile : 针对全局的设置

~/bash_profile : 只对该用户生效

常见的环境变量:

环境变量 释义
PATH 指定命令的搜索路径(linux 根据PATH 的值搜索命令)
HOME 当前用户的家目录
HISTSIZE 历史命令最大条数
LOGNAME 当前登录用户名
USER 当前用户名
SHELL 当前用户使用的shell环境
HOSTNAME 当前主机名
PWD 当前所在目录名

查看环境变量:

env #显示当前shell 的所有环境变量

[root@host103 ~]# env

2.7 只读变量

该变量只能使用,无法修改其变量值,放在内存的只读区域。

适用于变量值不允许修改的情况

格式:

readonly 变量名

[root@host103 ~]# name=zhangsan
[root@host103 ~]# readonly name
[root@host103 ~]# echo $name
zhangsan
[root@host103 ~]# name=lisi
-bash: name: 只读变量
[root@host103 ~]# unset name
-bash: unset: name: 无法反设定: 只读 variable
[root@host103 ~]# 

image-20210707160241547



2.8 位置变量

2.8.1 位置变量有哪些

位置变量有:$0 , $n (n为正整数),$#,$*,$@,$?,$$

变量 含义
$0 当前脚本文件名
$n 第n个参数。用来传递给脚本或者函数
$# 传递给脚本或者函数的所有参数
$* 传递给脚本或函数的所有参数
$@ 传递给脚本或者函数的所有参数
$? 上个命令,函数,的返回值。0为真,非0位假
$$ 当前shell 进程,脚本进程的PID
[root@host103 opt]# vim test.sh
#!/bin/bash
cd /opt/
echo "\$0  is  $0"     # "\" 反斜杠取消转义
echo "\$1  is  $1"
echo "\$2  is  $2"
echo "\$#  is  $#"
echo "\$?  is  $?"
echo "\$\$  is  $$"
:wq
[root@host103 opt]# chmod +x test.sh 
[root@host103 opt]# ./test.sh

image-20210707162353583



2.8.2 $* 与 $@ 区别

" **$ *** " 与 " $@" 都是表示传递给函数或者脚本的所有参数。

当 $* 和 $@ 没有 加 双引号 " " 时,都是将接受到每一个参数,看成独立的数据

当 $* 和 $@ 加 双引号 " " 时$* 将所有的参数看成一个数据, $@ 依然将每个参数看成独立的参数

[root@host103 opt]# vim example.sh
#!/bin/bash

echo "This is \"\$*\" :"  
for a in "$*"
do
    echo "$*"
done

echo "This is \"\$@\" :" 
for b  in "$@"
do
    echo  "$@"
done
:wq

[root@host103 opt]# source  example.sh  1  2  3
This is "$*" :
1 2 3
This is "$@" :
1 2 3
1 2 3
1 2 3

image-20210707165745699



posted @ 2021-07-05 18:33  知己一语  阅读(686)  评论(0编辑  收藏  举报