文章目录
一、变量的定义
1、定义
变量就是内存一片区域的地址
2、变量存在的意义
命令无法操作一直变化的目标,用一串固定的字符来表示不固定的目标可以解决此问题。
二、shell脚本中变量的定义方法
1、环境级别
export a=1
在环境关闭后变量失效
没有引进环境变量时:
引进环境变量:
2、用户级别
vim ~/.bash_profile
export a=2
可以在 ~/.bash_profile 中指定在执行脚本时某个目录中的脚本可以使用相对路径方式调用脚本
3、系统级别
vim /etc/profile
export a=2
vim /etc/profile.d/westos.sh
export b=3
用户级变量的设定在切换用户时会失效;因为切换用户之后,当前用户打开shell时读取变量的文件是自己家目录下的 .bash_profile
在系统级的配置文件 /etc/profile 中进行系统级变量定义
切换至普通用户也能够读取变量
4、变量名称
(1)、 变量名称可包含的字符
字母,下划线_,数字
(2)、变量名称定义规则
不能用数字开头
建议:
变量名称短全用大写字符
变量名称长用_区分子类
例如:
WESTOS
Westos_Linux
westoS_Linux
三、变量的转译
1、转译
符号 | 意义 |
---|---|
\ | 转译单个字符 |
“” | 弱引用,批量转译个数字符 不能转译"\ " “” “$” “!” |
‘’ | 强引用 |
2、声明
a=1
echo $ab
echo ${a}b
3、变量的数组
命令 | 意义 |
---|---|
a=(1 2 3 4 5) | 创建一个数组 |
echo ${a[0]} | 数组中第一个元素 |
echo${a[1]} | 数组中第二个元素 |
echo$[a[@:起始元素id:元素个数] | 从指定元素到指定元素的元素输出 |
echo${a[@]:0:3} | 数组中1-3个元素 |
echo a [ ∗ ] e c h o {a[*]}echo a[∗]echo{a[@]} | 数组中元素的个数 |
unset a[n] | 删除数组中的第n个元素 |
unset a | 删除a这个数组 |
注意*和@的区别
${a[*]}="1 2 3 4 5"
${a[@]}="1" "2" "3" "4" "5"
四、linux命令中的别名设定
alias xie='vim' ##临时设定
vim ~/.bashrc
alias xie='vim' ##只针对与用户生效
vim /etc/bashrc ##针对系统所以用户生效
alias xie='vim'
unalias xie ##删除当前环境中的alias
使用文件方式添加,对系统所用用户生效。当删除环境中的alias时,不能再被识别。
切换至普通用户,发现不能被识别
五、用户环境变量的更改
设定方式:
~/.bash_profile
export PATH=PATH:/mnt
/etc/bash_profile
export PATH=$PATH:/mnt
1、直接利用命令执行结果
优先执行
TEST=hostname TEST=$(hostname)
2、脚本中的传参
非交互模式:
参数 | 意义 |
---|---|
$0 | 脚本本身 |
$1 | 脚本后输入的第一串字符 |
$2 | 脚本后输入的第二串字符 |
$* | 脚本后输入的所有字符(“1 2 3”) |
$@ | 脚本后输入的所有字符(“1” “2” “3”) |
$# | 脚本后输入字符串的个数 |
交互模式传参:
read -p "Please input word: " (-s) WORD
##-p==显示提示语句;-s==隐藏录入内容;WORD==变量
echo $WORD
##显示变量的值
六、脚本函数
1、定义
程序的别名
2、设定方式
WORD()
{
action1
action2
}
WORD 在脚本中就代表action1 action2这两个动作
七、练习
1、创建用户
要求:
sh create_user.sh
Please input username: westos
westos exist> westos is exist>Please input username:
westos not existplease input password: 无回显密码
此用户会自动建立并且密码为提示后设定的密码
并显示:westos is created
并再次提示Please input username:
当Please input username:exit
此脚本退出
Create_user()#函数定义
{
read -p "Please input username:" USERNAME #将输入的文字作为变量USERNAME的直
[ "$USERNAME" = "EXIT" -o "$USERNAME" = "exit" ] &> /dev/null &&{
echo bye~ #当USERNAME为EXIT或者exit时退出脚本
exit
}
id $USERNAME &> /dev/null &&{
echo $USERNAME is exist #如果该用户存在则显示存在语句
Create_user
}||{
useradd $USERNAME #如果不存在则创建用户
read -p "please input password:" -s PASS #表示输入的密码不显示
echo "" #换行
echo $PASS | passwd --stdin $USERNAME && echo $USERNAME is created #将输入的密码保存并显示用户创建成功
Create_user
}
}
Create_user
实现:
2、显示系统中UID最大且能登陆系统的用户名
grep sh /etc/passwd | sort -rn -t : -k 3|head -n1| cut -d : -f 1
3、编写脚本file_check.sh
脚本后未指定检测文件——>“未指定检测文件,请指定”;脚本后指定文件不存在时——>“此文件不存在”;脚本后指定文件存在时请检测文件类型并显示到输出
#!/bin/bash
[ -z "$1" ] &>/dev/null &&{
echo "ERROR:Please input filename"
exit
}
[ -e "$1" ] &>/dev/null ||{
echo "$1 dose not exist!"
exit
}
[ -d "$1" ] &>/dev/null &&{
echo "$1 is a directory!"
exit
}
[ -S "$1" ] &>/dev/null &&{
echo "$1 is a socket"
exit
}
[ -L "$1" ] &>/dev/null &&{
echo "$1 is a link fike"
exit
}
[ -b "$1" ] &>/dev/null &&{
echo "$1 is a block device!"
exit
}
[ -c "$1" ] &>/dev/null &&{
echo "$1 zifushebei!"
exit
}
4、显示系统中能使用su命令切换的用户
awk '/bash$|sh$/{print $1}' /etc/passwd|cut -d : -f 1