变量:
变量即是用固定的字符串表示变化的值
变量的定义:
shell中的变量种类:
环境级变量,用户级变量,系统级变量
环境级变量:
(export) a=1
(声明) a=1
若不加export直接a=1,则该变量定义只会在当前shell进程环境中生效
(su,或bash开启另一个bash进程后,变量a定义就失效了)
但是export a=1,只要在当前进程中(或其子进程),即便是切换到其他用户(su student),变量也是仍然生效的。不过su - student加载用户环境后,a就失效了
用户级变量:
用户级变量写在用户的骨文件中,只针对当前用户生效
vim ~/.bash_profile
系统级变量:
系统级变量写在系统的配置文件 /etc/profile 或者 /etc/profile.d/ 中,对于所有用户都生效
vim /etc/profile
上面的两个用户级,系统级变量,在配置文件中定义了之后,必须要再重新加载执行才可以生效:
source ~/.bash_profile
source /etc/profile
env命令可以查看到系统中大多数的变量
我们之所以能直接使用命令,就是因为其脚本文件在/bin/等目录下,系统会根据环境变量PATH的值去找相应的脚本文件并执行
下图为例:
图一中,定义环境级变量
图二,三中,定义用户级变量
(使用bash命令在当前窗口进程下开启一bash子进程)
图四,五中,定义系统级变量
(定义时,忘了加上声明关键词export,变量作用范围一下子减小了很多)
图六,七中,重新定义系统级变量
变量命名规范:
不能以数字,符号开头
可以用字母,下划线开头,一般使用大写字母
\ 该符号用于字符的转义
" " 弱引用 (将引号内部的内容批量转义)
' ' 强引用
我理解的“转义“,即是将具有特殊意义的字符,以本身字符的形式使用(引用)
" "比' '能转义的字符数量少
" "不能转义\ ` ! $ 这四个符号,但是' '可以
下图为例:
图二中,可以看出,变量的值是作为字符串带入的。
${ }用于变量的声明,与上面的变量定义的export不同。这只是用于声明a是一个变量,而不是ab整体是一个变量
应用示例:
读取文件创建用户,更改密码:
#!/bin/bash
export a=`wc -w /mnt/userfile | awk '{print $1}'`
for NAME in `seq 1 $a`
do
b=`sed ${NAME}p -n /mnt/userfile`
c=`sed ${NAME}p -n /mnt/passfile`
useradd $b;
echo $c | passwd --stdin $b
done
变量值传递:
将变量值从脚本外部传递到内部
$1 脚本后面的第一串字符
$2 脚本后面的第二串字符
$3 脚本后面的第三串字符
$* 将脚本后面的所有字符识别为一组(一串)字符串
$@ 将脚本后面的所有字符识别为多组字符串(以空格为分隔符)
$# 脚本后面的字符串总数
$0 脚本名称
交互式定义变量: read
read -p 显示输入提示语(print打印)
read -s 输入不回显(隐藏)
下图为例:
图三中,在read语句中,使用WORD1,2变量保存变量的值
应用示例:
交互式控制用户管理
#!/bin/bash
[ $1 = '-d' ] && {
read -p "please input username:" -s NAME &&{
userdel -r $NAME
echo $NAME will delete
}
}
[ $1 = '-c' ] && {
read -p "please input username:" -s NAME &&{
read -p "please input password:" -s PASSWORD && {
useradd $NAME
echo $PASSWORD | passwd --stdin $NAME
}
}
}
命令别名的设定:
alias 查看命令别名
别名其实就是变量,只不过其变量的值是命令
任何命令都可以有别名
alias xie=‘vim’
设定命令别名xie,执行该别名,实际执行vim命令
(但是注意,这是环境级的变量)
用户级设定:
vim ~/.bashrc
(所有用户)系统级设定:
vim /etc/bashrc
更改配置文件后,使用source filename重新加载文件,使得增加的配置生效。
但是注意的是,上面的命令不是刷新配置,只是再次加载。
下图为例:
图一中,定义环境级命令别名
图二,三中,分别定义用户级命令别名和系统级命令别名
删除命令别名:
先删除上面两个配置文件中的设定。
注意:
这里不用source,不存在的设定自然就无法生效了
(但是当前环境下还有之前加载过的缓存)
只要关闭当前环境(shell),打开新的环境(shell),就会发现之前设定的命令别名无法使用了
或者不开启新的环境,只要执行下面的命令也可以:
unalias xie
设定的别名
命令退出值
默认情况下,一个命令如果在退出值为非零时,该命令的执行是不正常的(有报错的)
使用命令查看:echo $? 可以查看到上一条执行完毕的命令的退出值
但是我们可以使用exit num,认为设定脚本退出时的返回值为num
自定义函数
变量是一串字符等于一个值
函数是一串字符等于一个动作
(函数即代码块内部执行的动作)
函数应用:
缩减脚本的长度(将重复多次的动作封装定义为一个函数)
实现循环(自己调用自己)
#!/bin/bash
READ()
{
read -p "Please input word: " WORD
[ "$WORD" = "exit" ] && {
echo bye
exit 0
}
echo $WORD
READ
} #上面这些{ }内部的代码块,是对于READ这个函数执行动作的定义
READ #这句才是实际调用READ函数
下图为例: