1. 变量的定义
1.1 定义本身
变量就是内存中的一片区域的地址
1.2 变量存在的意义
命令无法操纵一直变化的目标,用一串固定的字符表示不固定的目标来解决此问题
2. shell脚本中变量的定义方法
2.1 环境级别(仅在当前环境下生效)
export a=1 ## 共享
特点:在环境关闭后,变量失效。
2.2 用户级别(仅在当前用户下生效)
## 改变用户家目录下的 .bash_profile
vim ~/.bash_profile
export a=1
2.3 系统级别
vim /etc/profile
export a=2
## 此时在系统中设定变量值为2,westos用户下设定变量值为1,在westos用户下输出变量值为1
## 这是因为先读全局文件,后读用户自身文件,因为会发生指向的变更,进行地址会重定向
vim /etc/profile.d/dsd.sh
export b=3
## 文件编写完成之后进行source,使其生效
从实验结果可以看出,哪个变量值最后被读取,即哪个生效,这是因为会发生指向的变更,进行地址会重定向
2.4 变量名称
"字符" 、"_"、"数字"
注意:不能用数字开头
建议:
变量名称短全用大写字符
变量名称长用"_"区分子类
3. 变量的转译
3.1 转译
\ ## 转译单个字符
"" ## 弱引用,批量转译特殊字符。不能转译 "\" "`" "$" "!"
'' ## 强引用
3.2 声明
{} ## 声明
a=1
echo $ab
echo ${a}b
3.3 变量的数组
a=(1 2 3 4 5)
echo $a ## 默认下标为0
echo ${a[0]} ## 输出数组第一个字符
echo ${a[1]} ## 输出数组第二个字符
echo ${a[*]} ## 输出数组所有字符
echo ${a[@]} ## 输出数组所有字符
###输出数组所有字符的*和@的区别###
a=(1 2 3)
a[*] = "1 2 3"
a[@] = "1" "2" "3"
4. Linux中命令的别名设定
alias xie='vim' ## 临时设定/环境级别设定
vim ~/.bashrc
alias xie='vim' ## 用户级别,只针对于用户生效
source ~/.bashrc
vim /etc/bashrc
alias xie='vim' ## 系统级别,针对系统所有用户生效
source /etc/bashrc
unalias xie ## 删除当下环境中的alias
5. 用户环境变量的更改
环境变量:用户在操作系统时使用到的命令搜索路径
5.1 用户级别
vim .bash_profile
###
export PATH=$PATH:/mnt
###
source .bash_profile
westos.sh
echo $PATH ## 输出PATH环境内容
5.2 系统级别
vim /etc/profile
###
export PATH=$PATH:/mnt
###
source /etc/profile
westos.sh
su - westos ## 切换用户
westos.sh
echo $PATH ## 输出PATH环境内容
6. 利用命令的执行结果设定变量
6.1 直接利用命令执行结果
$() ## 优先执行,shell中
`` ## 优先执行,所有均可
6.2 脚本中的传参
- 非交互模式
#!/bin/bash
echo '$0' is $0 ## 脚本本身
echo '$1' is $1 ## 脚本后所输入的第一串字符
echo '$2' is $2
echo '$3' is $3
echo '$*' is $* ## 脚本后所输入的所有字符"westos linux redhat"
echo '$@' is $@ ## 脚本后所输入的所有字符'westos' 'linux' 'redhat'
echo '$#' is $# ## 脚本后所输入的字符串个数
- 交互模式传参
read DSD ## 对DSD赋值
read -p "Please input word: " DSD ## 加-p表示输出提示语
read -p "Please input word: " -s DSD ## 加-s表示静默输入,隐藏输入内容
7. 脚本函数
函数:程序的别名
## 设定方式
WORD()
{
action1
action2
}
WORD在脚本中就代表action1和action2两个动作
8. 脚本练习
create_user.sh userfile passfile
userfile中的用户会被全部建立
passfile中的密码会被全部设定
#!/bin/bash
[ -z $1 ] && {
echo "未指定用户文件"
exit
}
[ -z $2 ] && {
echo "未指定密码文件"
exit
}
N=`awk 'BEGIN{n=0}{n++}END{print n}' userfile`
M=`awk 'BEGIN{m=0}{m++}END{print m}' passfile`
[ "$N" != "$M" ] && {
echo "用户与密码行数不匹配"
exit
}
for I in `seq 1 $N`
do
# 创建变量UserName和PassName
UserName=`sed -n ${I}P userfile`
PassName=`sed -n ${I}P passfile`
# 判断系统中是否已经存在该用户,如果存在,报错,反之则进行创建
if id $UserName > /dev/null 2>&1
then
echo $UserName 已经存在
else
useradd $UserName
echo $PassName | passwd --stdin $UserName
echo $UserName 创建成功
fi
done