版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Linux下shell(二)
文章目录
- Linux下shell(二)
1.内核和shell
系统是一个多任务多用户的操作系统,内核是程序调度器,可以对程序优先级进行调控。而为了避免内核被篡改破坏,则需要一个壳来保护内核,而shell就是这个壳。它也是操作系统中的一个软件,包在linux内核外面,为用户和内核之间的交互提供了一个接口。系统中的命令用shell去解释,而shell接受系统回应的输出并显示到屏幕中。
Shell脚本就是在shell中可以通过运行文件名即可执行相关命令的命令文件,是一种解释性语言。可以用shell脚本来保存执行动作、判定命令的执行条件以及实现动作的批量执行。
2.创建简单shell脚本
#!/bin/bash 通过shell来执行脚本中的命令,即解释器/通常用幻数“#!”指定
sh 在当前shell中开启一个子程序,在子程序中执行
source和 . 直接在当前shell中执行,不开启子程序
./ 需要执行权限,也是在当前shell中开启一个子程序,在子程序中执行
测试:
vim text.sh 编辑脚本
watch -n1 date 监视时间
sh text.sh sh执行脚本
ps f 查看进程具体情况
source text.sh source执行脚本
ps f 查看进程具体情况
. text.sh .执行脚本
ps f 查看进程具体情况
chmod +x text.sh 添加执行权限
./text.sh ./执行脚本
ps f 查看进程具体情况
(1)设置vim中快捷添加开头语
vim /etc/vimrc
map <F4> ms:call WESTOS()<cr>'s 按F4添加
autocmd BufNewFile *.sh exec ":call WESTOS()" 创建以.sh结尾的新文件时自动添加
function WESTOS()
call append(0,"###################################")
call append(1,"# Author: #")
call append(2,"# Create_Date: ".strftime("%Y-%m-%d %H:%M")." #")
call append(3,"# Version: #")
call append(4,"# Mali: #")
call append(5,"# Description: #")
call append(6,"# #")
call append(7,"###################################")
call append(8,"")
call append(9,"#!/bin/bash")
endfunction
(2)编写简单脚本:
【1】执行ip_show.sh显示当前主机的ip
vim ip_show.sh
#! /bin/bash
ifconfig eth0 | awk '/inet\>/{print $2}'
【2】执行user_show.sh显示当前主机中可以登录系统的用户
vim user_show.sh
#! /bin/bash
awk -F : '/bash$/{print $5}' /etc/passwd
【3】执行host_message.sh显示当前主机的名称,ip,一级可以登录系统的用户
vim host_message.sh
#!/bin/bash
echo 主机名:
hostname | awk -F . '{print $1}'
echo ip地址:
ifconfig eth0 | awk '/inet\>/{print $2}'
echo 可以登录系统的用户:
awk -F : '/bash$/{print $5}' /etc/passwd
【4】执行clear_log.sh命令后可以清空日志
#!/bin/bash
[ "$USER" = "root" ] && {
> /var/log/messages
echo "Clean messages successfully. "
}||{
echo "This scrip must run with root!"
}
3.变量
系统环境变量文件 : /etc/profile
(1)变量名称规范性
变量名称中通常包含大小写字母,数字,下划线(不是必须)
(2)字符转译及变量声明
\ 转译单个字符
'' 强引用,批量转换""中出现的字符
"" 弱引用,批量转译""中出现的字符
${} 变量申明
''和""的区别
""不能转译 = ! ? ` \ 等
(1)环境级变量:
只对当前环境生效,切换当前环境后就不再生效
export a=1 申明a的值
测试:
echo $a 此时显示a的值“1”
bash 开启另一个shell
echo $a 此时依然可以显示a的值
(2)用户级变量:
只对当前用户有效
vim ~/.bash_profile
export b=3
测试:
source .bash_profile 加载新添加的环境变量,使变量立即生效
echo $b 此时显示b的值“2”
su - student 切换用户
echo $b 此时无法显示b的值“2”
(3)系统级变量:
对所有用户所有环境都有效
vim /etc/profile
export WESTOS=123
source /etc/profile 加载新添加的环境变量,使变量立即生效
测试:
echo $WESTOS 此时会显示WESTOS的值“123”
bash 开启另一个shell
echo $WESTOS 此时依然会显示WESTOS的值“123”
su - student 切换用户
echo $WESTOS 此时依然会显示WESTOS的值“123”
(4)su
**su - **加载了用户身份,以及shell配置文件和系统环境变量
su 沿用之前环境,加载shell配置文件
shell配置文件 /etc/bashrc
(5)变量值传递
$0 脚本本身
$1 脚本后的第一串字符串
$2 脚本后的第二串字符串
$3 脚本后的第三个字符串
$# 脚本后跟的字符串个数
$* 脚本后跟的所有字符串
$@
注: *的区别:
$@=“1” “2” “3” 分开执行
$*=“1 2 3” 识别为一串字符
(6)用read实现变量传递
交互式变量
read test
read -s test
read -p "input:" test
-p 打印
-s 隐藏,输入时没有回显
4.编写脚本实现功能
(1)编辑脚本实现功能:添加文件中的用户
vim usd.sh
#!/bin/bash
[ "$USER" != "root" ]&&{ 检测是否为root用户,不是则退出
echo -e "\033[31mThis scrip must run with root !\033[0m"
exit 0
}
read -p "Please input username file : " USN
[ -e "$USN" ]||{ 检测文件是否存在,不是则退出
echo -e "\033[31mPlease input right file !\033[0m"
exit 0
}
for NAME in `cat $USN` 设定NAME变量
do
useradd $NAME &> /dev/null && { 添加用户,成功则提示成功
echo -e "\033[32mThe $NAME is created !\033[0m"
}||{
echo -e "\033[31mThe $NAME is exist !\033[0m" 失败则提示用户已存在
}
done
(2)编辑脚本实现功能:添加文件1中的用户,并且将文件2中的密码设置为文件1中用户的密码
vim add.sh
#!/bin/bash
[ "$USER" != "root" ]&&{ 检测是否为root用户,不是则退出
echo -e "\033[31mThis scrip must run with root !\033[0m"
exit 0
}
[ -e "$1" ]||{ 检测输入的用户名文件是否有数据,不是则退出
echo -e "\033[31mPlease input right namefile !\033[0m"
exit 0
}
[ -e "$2" ]||{ 测输入的用户名文件是否有数据,不是则退出
echo -e "\033[31mPlease input right passwdfile !\033[0m"
exit 0
}
Line=`awk 'BEGIN{N=0}{N++}END{print N}' $1` 采集文件中需要添加的用户总数
for NAME in `seq 1 $Line` 设置总数变量
do
USERNAME=`sed -n ${NAME}p $1` 设置用户名变量
PASSWORD=`sed -n ${NAME}p $2` 设置用户密码变量
useradd $USERNAME &> /dev/null && { 添加用户,成功则进行改密
echo "$PASSWORD" | passwd --stdin $USERNAME &> /dev/null 改密
echo -e "\033[32mThe $USERNAME is created !\033[0m"
}||{ 添加用户失败则提醒用户已存在
echo -e "\033[31mThe $USERNAME is exist !\033[0m"
}
done
(3)编辑脚本实现功能:输入 -d 删除用户;-c 添加用户并改密码
vim usc.sh
#!/bin/bash
[ "$USER" != "root" ]&&{ 检测是否为root用户,不是则退出
echo -e "\033[31mThis scrip must run with root !\033[0m"
exit 0
}
read -p "Please input your choose d or c : " D 提示输入命令d或者c,采集命令变量
C=`echo $D | tr 'A-Z' 'a-z'` 设定大小写的转换
[ "$C" = "d" -o "$C" = "c" ]||{ 判断命令是否是"d"或者"c",不是则退出
echo -e "\033[31mPlease input right choose !\033[0m"
exit 0
}
[ "$C" = "d" ]&&{ 判断命令是否为"d",是"d"则执行删除命令
read -p "Please input username : " NAME 提示输入被删除的用户名,采集名称变量
userdel $NAME &> /dev/null &&{ 进行用户删除,成功则提示成功
echo -e "\033[32m$NAME is deleted!\033[0m"
}||{ 删除失败则提示没有此用户
echo -e "\033[31mNot found $NAME ...\033[0m"
}
}
[ "$C" = "c" ]&&{ 判断命令是否为"c",是"c"则执行添加及改密命令
read -p "Please input username : " NAME 提示输入添加的用户名,采集名称变量
useradd $NAME &> /dev/null &&{ 进行用户添加,成功则提示成功
read -p "Please input password : " PWD 提示输入用户密码,采集密码变量
echo "$PWD" | passwd --stdin $NAME &> /dev/null
echo -e "\033[32m$NAME is created!\033[0m"
echo -e "\033[32m$NAME password is changed!\033[0m"
}||{ 添加失败则提示此用户已存在
echo -e "\033[31mThe $NAME is exist...\033[0m"
}
}
5.系统中的命令别名
例:
/bin/ls 此时使用ls命令只能显示文件名
ls --color=auto 此时使用ls命令可以显示文件名,并且区分文件类型
(1)常见的系统别名:
alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
(2)添加系统别名:
【1】环境变量添加
alias xie='vim' 添加xie为vim命令的别名
测试:
xie lee 尝试使用别名调用命令,此时可以调用
bash 切换环境
xie lee 尝试使用别名调用命令,此时不可以调用
【2】用户变量添加
vim /root/.bashrc 编辑用户变量相关配置文件
alias xie='vim' 添加xie为vim命令的别名
source /root/.bashrc 加载新添加的变量
bash 切换环境
xie lee 尝试使用别名调用命令,此时可以调用
su - student 切换用户
xie lee 尝试使用别名调用命令,此时不可以调用
【3】系统变量添加
vim /etc/bashrc 编辑系统变量相关配置文件
alias xie='vim' 添加xie为vim命令的别名
source /root/bashrc 加载新添加的变量
bash 切换环境
xie lee 尝试使用别名调用命令,此时可以调用
su - student 切换用户
xie lee 尝试使用别名调用命令,此时可以调用
(3)删除系统别名:
vim /root/.bashrc 编辑用户变量相关配置文件,删除用户变量中的别名
vim /etc/bashrc 编辑系统变量相关配置文件,删除系统变量中的别名
alias 此时查看系统别名,发现仍然存在“xie”
unalias xie 彻底删除xie
alias 此时查看系统别名,发现“xie”已被删除
(4)利用命令执行结果设定变量
$?是命令在执行完成之后产生的退出值,范围是[0-255]。当**$0=0时标示命令执行没有错误输出,并且这个值可以用exit**命令执行。
例:
vim text.sh 编辑脚本
echo hello bye~
sh text.sh 执行命令
echo $? 查看退出值,此时是0
vim text.sh 编辑脚本
exit 88 设置退出值
sh text.sh 执行命令
echo $? 查看退出值,此时是88
6.脚本中的函数
脚本中的函数是把一个复杂的与语句块定义成一个字符串的方法。
例:
vim westos.sh 编辑脚本
WESTOS() 设定一个简单函数
{
echo $1
}
WESTOS "hello bye~" 调用函数
sh westos.sh 执行脚本
(1)编写脚本实现以下功能:执行脚本后需要输入字符,直到输入“exit”才退出
vim exit.sh
#!/bin/bash
READ() 设定函数
{
read -p "Please input name: " NAME 输入名字
[ "$NAME" = "exit" ] && { 判断是否为“exit”,是则退出
echo piss off
exit 0
}
echo $NAME
READ 继续执行函数
}
READ 调用函数
sh exit.sh 执行命令
(2)编写脚本实现功能:执行脚本后需要输入用户名,如果此用户已存在则输出“xxx is exist”。如果用户不存在则需要再次输入用户名,此时可以添加用户,并且需要输入密码对新添加的用户设定密码。当输入“exit”是则退出脚本
vim crete.sh
#!/bin/bash
USER() 设定函数
{
read -p "Please input username: " NAME 输入用户名
[ "$NAME" = "exti" ] && { 判断输入是否为“exit”,是则退出
echo "bye~"
exit 0
}
useradd $NAME &> /dev/null && { 添加用户,如果成功则继续进行密码的设置
read -p "Please input password: " PSWD -s 输入密码
echo $PSWD | passwd --stdin $NAME &> /dev/null 设置密码
echo -e "\033[32m$NAME is created successfully. \033[0m"
}||{ 添加用户失败(用户已存在)则提示
echo -e "\033[31m$NAME is exist...\033[0m"
}
}
USER 调用函数
sh crete.sh 执行脚本
7.for循环语句
for
do
done
例:
vim for.sh 编辑脚本
for i in {10..1} 设定“i”变量的取值范围从10—1
do
echo $i 显示“i”
done
sh for.sh 执行脚本
(1)编写脚本实现功能:使用for语句实现10秒倒计时
vim sec.sh
#!/bin/bash
for SEC in {10..1} 设置SEC变量的取值范围为10-1
do
echo -ne "\033[31mAfter ${SEC}s will end\033[0m" 倒计时提示
echo -ne "\r" 设置覆盖
sleep 1 每隔一秒显示一次
done
sh sec.sh 执行命令
(2)编写脚本实现功能:测试是否可以访问其他主机,将可以访问的主机ip导入到文件中
vim ip.sh
#!/bin/bash
[ -e "/mnt/IP" ] && { 判断被导入的文件是否存在,存在则继续执行
echo "/mnt/IP is exitst!" 提示已存在
echo "[O]verwrite [B]ackup [S]kip" 用户选择O(覆盖)、B(备份)、S(跳过)
read -p "Please choose : " WORD 输入选择
CHOOSE=`echo $WORD | tr 'a-z' 'A-Z'` 设置输入的选择不区分大小写
[ "$CHOOSE" = "O" ] && {
rm -fr /mnt/IP 当选择O时删除原有文件
}
[ "$CHOOSE" = "B" ] && {
mv /mnt/IP /mnt/IP.bak 当选择B时进行备份
}
[ "$CHOOSE" = "S" ] && {
exit 0 当选择S时则退出脚本
}
}
for IP in {1..20} 设定IP取值范围为1-20
do
ping -c1 -w1 172.25.254.$IP &> /dev/null &&{
echo 172.25.254.$IP >> /mnt/IP 尝试ping,可以则将ip导入指定文件
}
done
sh ip.sh 执行脚本
8.while语句
编辑脚本实现功能:执行脚本可以实现分、秒倒计时
vim min.sh
#!/bin/bash
SEC=15
MIN=1 设定从1分15秒开始倒计时
for ((SEC=15;SEC>=0;SEC--)) 设置秒的自减一功能
do
while [ "$SEC" = "0" -a "$MIN" = "0" ] 设置当计时到0:0时退出
do
exit 0
done
while [ "$SEC" = "0" ] 设置当计时到1:0时,进行以下操作
do
echo -ne "After $MIN:$SEC will end. "
echo -ne "\r"
sleep 1
SEC=59
((MIN--))
done
echo -ne "After $MIN:$SEC will end. "
echo -ne "\r"
sleep 1
done
sh min.sh 执行脚本