Linux里 Shell脚本基础及变量
一 Shell 脚本概述
1.1 shell 脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 要给该文件可执行权限
- 可以结合各种Shell 控制语句以完成更复杂的操作
1.2 Shell 脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
- ......
1.3 Shell 的作用
Shell ——命令解释器,介于系统内核与用户之间,一种被称为解释性语言或者脚本语言的计算机语言。充当"翻译官"的作用
Linux 系统中运行的 一种特殊程序,用户登录Linux 系统时,自动加载一个Shell 程序
Linux 系统棕默认使用的Shell程序是 Bash ,文件位于 /bin/bash
不同Shell 的内部指令,运行环境会有区别

1.4 Shell 基本的构成
- 脚本声明
- 注释信息
- 可执行语句
[root@host102 ~]# vim test.sh

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

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

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"

先psree 查看进程树
[root@host102 ~]# pstree 

然后运行脚本,再打开另一个终端 查看进程树
(1)[root@host102 ~]# bash test.sh 

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

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

使用type 命令查看 source 和 " . "
[root@host102 ~]# type source .

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 结果是一样的,但是其表示意义不一样

2,标准重定向输出
如果前面命令返回值为0(即,命令正确),则将结果重定向输出到指定文件
返回值: 命令运行正确,则返回值为0 .命令运行错误,则返回非  0 值。可以用echo  $? 查看上一条命令的返回值

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

4.混合输出
将所有输出信息重定向到指定文件

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

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

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

二: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

使用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 ~]# 

引号的使用:
双引号 "":允许通过$ 符号引用其他变量值,不取消特殊符号的释义
单引号 '':禁止引用其他变量值,$视为普通字符,取消特殊符号的释义
反撇号``:命令替换,提取命令执行后的输出结果。作用与$() 相同
双引号:
[root@host102 opt]# myname=zhangsan
[root@host102 opt]# yourname=lisi
[root@host102 opt]# name="$myname,$yourname"
[root@host102 opt]# echo $name
zhangsan,lisi

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

反撇号:
[root@host102 opt]# myhostname=`hostname`
[root@host102 opt]# echo myhostname
myhostname

2.3 从键盘输入内容为变量赋值
read [-p “提示信息”] 变量名
[root@host102 opt]# read -p "input your name:" name
input your name:zhangsan
[root@host102 opt]# echo $name
zhangsan

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]# 

全局变量:
可以在全局都有效的变量,不管是新的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]# 

格式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]# 

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

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

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]# 

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

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 ~]# 

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

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


 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号