shell变量的分类:自定义变量,环境变量,位置变量的定义规则及使用详解

一. shell脚本的编写过程

1.1 新建脚本文件

  • 第一行#!/bin/bash 表示脚本声明,表示此行以后的语句通过/bin/bash程序来解析执行

1.2 添加可执行权限

  • chmod +x 脚本文件

1.3 直接运行脚本文件

  • 脚本文件路径(绝对路径或者相对路径)

    • ##./first.sh
  • sh 脚本文件路径

    • ##sh ./first.sh
  • source 脚本文件路径

    • ##sourece first.sh

二. 管道与重定向

2.1 管道符号 |

  • 同一行命令中可以使用多个管道符号,管道符号左侧命令输出的结果等于将作为右侧的输入(处理对象)

    • ##grep “/bin/bash$” /etc/passwd | awk -F: ‘{print $1,$7}’

2.2 重定向操作

  • 重定向输入

    • ##vi pass.txt 添加初始密码串12345678

    • ##passwd --stdin jerry < pass.txt

      • 从passwd 中取密码
  • 重定向输出

    • 输出结果覆盖到文件中

      • ##uname -p > kernel.txt
    • 输出结果追加到文件中

      • ##uname -p >> kernel.txt
  • 错误重定向

    • 2> 覆盖目标文件内容

      • ##tar jcf/nonedir/etc/etc.tgz/etc 2> error.log
    • 2>> 追加内容到目标文件

      • ##tar jcf/nonedir/etc/etc.tgz/etc 2>> error.log

三. shell 变量的分类

3.1 用户自定义变量

既本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。

[root@localhost ~]# ps
   PID TTY          TIME CMD
 10136 pts/0    00:00:00 bash
 10961 pts/0    00:00:00 ps
[root@localhost ~]# a=123
[root@localhost ~]# echo $a
123
[root@localhost ~]# su - liang
[liang@localhost ~]$ ps
   PID TTY          TIME CMD
 10993 pts/0    00:00:00 bash
 11038 pts/0    00:00:00 ps
 [liang@localhost ~]$ echo $a
 [root@localhost ~]#             ##变量为空
 

3.11 变量的定义规则

  • 基本格式:变量名=变量值
    • VERSION=6.0
    • 等号两边没有空格,变量名称需要以字母或者下划线开头,名称中不 要包括特殊字符
1)变量名区分大小写
[root@localhost ~]# A=hello
[root@localhost ~]# a=word
[root@localhost ~]# echo $A
hello
[root@localhost ~]# echo $a
word
2)变量名不能有特殊符号
[root@localhost ~]# *A=hello
bash: *A=hello: 未找到命令...
[root@localhost ~]# ?B=123
bash: ?B=123: 未找到命令...
[root@localhost ~]# #B=123
[root@localhost ~]# echo $#B
0B
[root@localhost ~]# echo $(#B)
> ^C
[root@localhost ~]# echo ${#B}
0
3) 变量不能以数字开头但是可以包含数字
[root@localhost ~]# 12A=hello
bash: 12A=hello: 未找到命令...
[root@localhost ~]# A12=hello
[root@localhost ~]# echo $A12
hello
4) 变量等号两边不能有空格
[root@localhost ~]# A = 123
bash: A: 未找到命令...
[root@localhost ~]# A=123
[root@localhost ~]# echo $A
123
5)变量名尽量做到见名知其意
[root@localhost ~]# DIR=/u01/peihua
[root@localhost ~]# NTP_IP=10.1.1.1

说明:一般变量名使用大写(小写也可以),不要同一个脚本中的变量全是a,b,c等不容易阅读。

3.12 怎样查看和引用变量的值

1) $调用变量的值
[root@localhost ~]# A=123456
[root@localhost ~]# echo $A
123456
[root@localhost ~]# echo ${A}
123456
[root@localhost ~]# echo ${A:2:3}     #表示从A变量中第3个字符开始截取,截取3个字符。切片调用
345

说明:变 量 名 和 变量名和{变量名}的异同 相同点:都可以调用变量 不同点:变 量 名 可 以 只 截 取 变 量 的 一 部 分 , 而 {变量名}可以只截取变量的一部分,而变量名不可以

- 当变量名称和紧跟其后的字符相混淆时,需要用{}将变量括起来再调用。
	- echo ${VERSION}6.1
2) 变量赋值的特殊操作
- 双引号(“”)

	- 界定字符串,赋值的内容包括空格,必须以双引号括起来,在双引号的范围内,使用$符号引用变量值

		- ##WEIXIN="weixin  5.0"

- 单引号(')

	- 变量值包括特殊符号%¥¥#@等,使用单引号括起来。在单引号的范围内无法引用其他变量的值

		- ##PEI=‘$peihua%’

- 反撇号(`)

	- 反撇号主要用于命令替换,允许将执行某个命令的输出结果赋值给变量

		- ##DENNLIST=`grep -v  "^#" /etc/vsftpd`

	- 实现两个命令以上的嵌套命令,需要改用$()来代替反撇号

		- ##rpm -qc $(rpm -qf $(which useradd))

- bash的内置命令read 给变量赋值

	- 

3.13 交互式定义变量(read)

目的:让用户自己给变量赋值,比较灵活
语法:read [选项] 变量名

选项释义
-p定义提示用户信息
-n定义字符数(限制变量值的长度)
-s不显示(不显示用户输入的内容)
-t定义超时时间,默认单位为秒(限制用户输入变量值的超时时间)

举例说明

1) 用户自己定义变量值(用法1)
[root@localhost ~]# read -s -t 5 -n 5 -p "input your password" name    #不显示输入内容,限制用户输入时间为5秒,输入的字符为5个
input your password[root@localhost ~]# echo $name
12345
[root@localhost ~]# 
2) 变量值来自文件 (用法2)
[root@localhost ~]# cat ip.txt 
10.0.0.100
[root@localhost ~]# read -p "input your IP:" IP < ip.txt 
[root@localhost ~]# echo $IP
10.0.0.100

3.2 环境变量

3.21环境变量

环境变量:当前进程有效,并且能够被子进程调用,在子进程定义的在父进程不能调用
- env 查看当前用户的环境变量
- set 查询当前用户的所有变量(临时变量与环境变量)
- export 变量名=变量值 或者 变量名=变量值;export 变量名

[root@localhost ~]# B=123
[root@localhost ~]# export B      #临时把一个临时变量变成环境变量(切换用户不生效)
[root@localhost ~]# env | grep B
B=123
[root@localhost ~]# export C=1234   #临时定义一个环境变量(切换用户不生效)
[root@localhost ~]# env | grep C
C=1234
SSH_CLIENT=20.0.0.1 58504 22

3.22 全局变量

全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用。

文件名说明备注
$HOME/.bashrc当前用户的bash信息,用户登录时读取定义别名,umask,函数等
$HOME/.bash_profile当前的环境变量用户登录时读取
$HOME/.bash_logout当前用户退出当前shell时最后读取定义用户退出时执行的程序等
/etc/bashrc全局的bash信息,所有用户都生效
/etc/profile全局环境变量信息系统和用户都生效

说明:以上文件修改后,都需要重新source让其生效或者退出重新登录。

用户登录系统读取相关文件的顺序

  1. /etc/profile
  2. $HOME/.bash_profile
  3. $HOME/.bashrc
  4. /etc/bashrc

3.3 系统变量(内置bash中变量)

内置bash变量:shell本身已经固定好了他的名字和作用

3.31 位置变量
位置变量含义
$0当前执行的程序或脚本名
$1-$9脚本后面的位置参数,$1表示第一个位置参数,一次类推
{10}-${n}扩展位置参数,第十个位置参数变量必须用{}大括号括起来(两位数字以上括起来)
3.22 预定义变量
预定义变量含义
$#脚本后面参数的个数
$*脚本后面所有参数,参数当成一盒整体输出,每一个变量参数之间以空格隔开
$@脚本后面所有的参数,参数是独立的,也是全部输出
$?上一条命令执行后的返回状态;状态值为0表示执行正常,非0表示执行异常或者错误
$!后台运行的最后一个进程号(当前终端)
$$当前所在进程的进程号,如echo $$

版权声明:本文为weixin_48192495原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。