Linux下shell(二):脚本、变量、别名、函数、语句等

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Leslie_qlh/article/details/100024602

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			执行脚本

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Leslie_qlh/article/details/100024602