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让其生效或者退出重新登录。
用户登录系统读取相关文件的顺序
/etc/profile
$HOME/.bash_profile
$HOME/.bashrc
/etc/bashrc
3.3 系统变量(内置bash中变量)
内置bash变量:shell本身已经固定好了他的名字和作用
3.31 位置变量
位置变量
含义
$0
当前执行的程序或脚本名
$1-$9
脚本后面的位置参数,$1表示第一个位置参数,一次类推
{10}-${n}
扩展位置参数,第十个位置参数变量必须用{}大括号括起来(两位数字以上括起来)
3.22 预定义变量
预定义变量
含义
$#
脚本后面参数的个数
$*
脚本后面所有参数,参数当成一盒整体输出,每一个变量参数之间以空格隔开
$@
脚本后面所有的参数,参数是独立的,也是全部输出
$?
上一条命令执行后的返回状态;状态值为0表示执行正常,非0表示执行异常或者错误
$!
后台运行的最后一个进程号(当前终端)
$$
当前所在进程的进程号,如echo $$
关键词:shell,åé,åç±»,èªå®ä¹,å®ä¹,ç¯å¢,ç¯å¢åé,ä½ç½®,ä½ç½®åé,è§å,使ç¨,详解