变量的定义
- 变量即在程序运行过程中它的值是允许改变的量
- 变量是用一串固定的字符来标识不固定的值得一种方法
- 变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储 Script 运行时可更改的程序信息
- 在 Shell 中变量是不能永久保存在系统中的,必须在文件中声明
变量的种类–在 Shell 脚本中
- 在 Shell 中变量分为环境级变量、用户级变量、系统级变量
- 环境级变量只在当前 Shell 中生效, Shell 关闭变量丢失
- 用户级变量写在用户的 .bash_profile 配置文件中,只针对当前用户生效
- 系统级变量写在系统的 /etc/profile 或者 /etc/profile.d 中,对于所有用户都生效
export
临时全局系统变量
export a=1
echo $a
1
不声明临时全局系统变量
b=1
echo $b
切换用户测试
1、 su student
echo $a
1
echo $b
无输出
2、 su - student
echo $a
echo $b
两次都无输出
系统级全局变量配置
vim /etc/profile
编辑配置文件
cat /etc/profile | tail -n | head -n 1
a=1
添加 a=1
source /etc/profile
立即生效
echo $a
1
有输出
切换用户测试
1、su student
echo $a
1
有输出
2、 su - student
echo $a
1
用户级环境变量
只针对当前用户生效,切换用户即失效
vim ~/.bash_profile
cat ~/.bash_profile | tail -n 3 | head -n 1
PATH=$PATH:$HOME/bin:/mnt
添加 /mnt ,使 /mnt下面的文件修改为全局文件
source ~/.bash_profile
a=1
设置变量
vim /mnt/test_a.sh
cat /mnt/test_a.sh | tail -n 1
echo $a
sh test_a.sh
1
正常情况下,未设置用户级环境变量,脚本只能在当前目录下执行
设置用户级环境变量后,可以在任何路径执行自定义文件
变量名称的规范
变量名称中通常包含大小写字母、数字、下划线(不是必须)
变量名称格式
TEST_LINUX
Test_Linux
tesT_Linux
字符的转译及变量的声明
\ 转译单个字符
““ 弱引用,批量转译 ”“ 中出现的字符或字符串
‘‘ 强引用,批量转译 ‘’ 中出现的字符或字符串
‘‘ 与 “” 两者的区别在于, “” 不能转译 “”、"`"、"!"、"$"
${} 变量声明
使用变量,输出 *
号
a=*
echo $a
输出当前目录下全部文件
a=\*
添加转译符
echo $a
输出当前目录下全部文件(转译符未生效)
echo '$a'
使用强引用符
输出为 $a
echo "$a"
使用弱引用符
输出为
*
直接显示 * 号
echo *
输出当前目录下全部文件
echo \*
使用转译符
输出
*
echo ""
echo '’
直接显示 !
号
echo "!"
echo '!'
直接显示 ?
号
echo "?"
echo '?'
直接显示 \
号
echo "\"
echo '\'
echo \
echo \\
echo "\\"
echo '\\'
实验
1、自动创建用户脚本
vim /mnt/create_users.sh
vim /mnt /userfile
cat /mnt/userfile
user1
user2
user3
cat /mnt/create_users.sh
脚本思路
首先判断使用者身份是否 root 用户(只有 root 用户才能创建用户)
身份正确,再判断是否使用所要生成用户名的文件
身份错误,提示使用 root 身份
身份正确,但没有或者使用错误用户名文件,提示使用正确用户名文件
两者判断正确,开始创建用户
在创建过程中,发现用户已存在,提示用户已存在
测试脚本
sh create_users.sh
未使用用户名文件,报错,提示使用用户名文件
sh create_users.sh 12
报错,12 文件不存在
sh create_users.sh /mnt/userfile
正确,提示已创建所需要的用户
sh create_users.sh /mnt/userfile
再次创建,提示已存在用户
userdel user1
userdel user2
userdel user3
删除刚创建的用户
useradd user2
sh create_users.sh /mnt/userfile
提示 user1 建立
提示 user2 已存在
提示 user3 建立
使用
student
身份 执行脚本提示错误
2、创建、删除系统用户脚本
vim userctrl.sh
脚本思路
首先判断 “-c” 创建 、 “-d” 删除
如果不是 “-c” 或 “-d” 命令时,报错,提示只有 “-c” 或 “-d” 两个命令
当使用 “-c” 命令时,弹出对话框输入用户名,再次弹出对话框输入用户密码
当用户存在时,提示用户已存在
当用户创建完成时,提示用户已创建
当用户密码创建成功时,提示用户密码已生成并退出脚本
当使用 “-d” 命令时,弹出对话框,输入用户名,删除用户,当用户删除后,提示用户已删除
如果所输入的用户名不在系统用户内,报错,提示输入系统用户
脚本测试
sh userctrl.sh
脚本后面没有跟命令,报错,提示-d 或 -c 命令
sh userctrl.sh -c
创建用户
leon
用户名
密码
提示创建完成
su - leon
exit
sh userctrl.sh -d
leon
删除用户
提示已删除
id leon
别名设置
命令别名就是为一条命令定义一个命令名,执行这个新的命令名就相当于执行这条命令
创建临时别名
alias look='cat'
定义临时别名
alisa
查看别名
cat -n test1
look -n test1
别名定义成功
unalias look
删除 临时别名
创建用户级别名
vim /root/.bashrc
编辑 /root/.bashrc 配置文件
添加
alias look='cat'
source /root/.bashrc
立刻生效
cat -n test1
look -n test1
系统级全局别名
vim /etc/bashrc
source /etc/bashrc
su - student
切换用户
look -n f1
别名生效
alias look='cat'
命令执行结果设定变量
Hostname=$(hostname)
Hostname=
hostname
$?
命令执行完成后产生的退出值(范围是[0-255])
当$0=0时表示命令执行没有错误输出
这个值可以用 exit 设置
例如:exit 111
cat test.sh | tail -n 2
Shell
脚本中的函数
脚本中的函数是把一个复杂的语句块定义成一个字符串的方法
实验
1、测试所有 ping 网络可达的主机,并导入/host_ip 文件内
vim ceshiping.sh
脚本思路
判定文件是否存在
没有存在,生成文件
已存在,提示 重新写入 、备份 、 略过 三个基本功能
弹出对话框,输入所需要功能
重新写入–覆盖原文件并生成新文件
备份–删除原文件并生成新备份文件
略过–跳过,什么都不做
在这里还需要注意大小写,无论大写还是小写命令都应生效
最后测试 广播域内的 ip 是否开启并导入文件内
vim ceshiping.sh
sh -x ceshiping.sh
先判断没有 /host_ip 文件
再创建文件并导入广播域内网络可达 ip
sh ceshiping.sh
文件已存在
小写 o 可使用
大写 o 可使用
o
–重新写入文件
cat /host_ip
sh ceshiping.sh
文件已存在
b
–备份
cat /host_ip.bak
sh ceshiping.sh
文件已存在
s
–略过,什么都不做
2、创建用户及用户密码
脚本思路
当用户存在,提示用户存在
当用户不存在,创建用户及用户密码
退出
vim create_user.sh
sh create_user.sh
输入用户名
输入用户密码
创建成功
exit
退出
For 循环
For
do
done
for x in a b c
循环条件
do
开启
echo $x
执行命令
done
完成
字符 a、b、c 依次输出for x in
seq 1 2 10
do
echo $x
done
seq 1 2 10
设置步长
for x in {1..10}
do
echo $x
done
for x in {10..1}
do
echo $x
done
for x in {a..f}
do
echo $x
done
实验
1、倒计时
vim daojishi.sh
脚本思路
首先使用循环命令
倒数计数:一秒一显示
sh daojishu.sh
倒计时在一行显示,echo -n
While
循环
while
do
done
sh true.sh
首先判断退出
其次使用 while true 写一个死循环
最后使用 exit 退出
sh true.sh
leon
leo
zhang
exit
该脚本是一个死循环脚本,没有判断 退出 ,无限循环
Until
循环
until
do
done
sh until.sh
首先判断退出
其次使用 until false 写一个死循环
最后使用 exit 退出
sh until.sh
gg
asd
exit
该脚本是一个死循环脚本,没有判断 退出 ,无限循环
分钟:秒钟–倒计时
vim daojishu1.sh
脚本思路
当秒钟从10开始,走到0时,分钟由1变为0
当分钟变为0时,秒钟从59开始,走到0结束
sh daojishu1.sh
分钟1
秒钟6
分钟0
秒钟57