shell shell脚本编写常用命令 语法 shell 脚本工具推荐

shell 脚本

计算机语言

Shebang 定义解释器

主要定义,您的脚本是用什么语言写的

#!/usr/bin/python    //定义这是一个python语言

#!/bin/bash    //定义这是一个shell语言
echo @SHELL

我们执行的 linux 命令的时候,其实是使用 /bin/bash 这个二进制文件对 命令文件执行的。

路径问题处理

执行脚本的时候,脚本中的路径会以用户当前位置开始计算
所以 推荐使用根路径 来对文件进行编辑


pwd
echo  $(dirname $0) && echo "执行成功"

echo /root/k/king/a.sh

cat /root/k/king/a.sh   # 执行成功

# 处理路径问题

echo $(dirname $0)/king/a.sh

cat /root/k/king/a.sh   # 执行失败

$(dirname $0) == /root/k
/root/k/king/a.sh
/root/k/king/a.sh

shell 能做什么
自动备份和恢复,mysql  
自动化管理
自动化信息采集监控,对 系统硬件 指标 采集回来。(主要用在监控层面)
自动化扩容  

shell 脚本必须

获取路径
假设一个文件
dirname /a/b/c.sh


basename c

父进程调用子进程 source

# 父进程 调用子进程 
# 如果要调用 子进程脚本
需要 使用  
source



拒绝 ctrl + c

添加 trap : INT 之后则此进程不可以使用 ctrl + c 中断

trap : INT

for i in {1..100}
do  
	trap : INT
    i=$[ $i +1 ]
	echo "$i"
    sleep 1
done

括号使用

[[ ]]  		# 判断
(()) == []  # 判断
() == `` 	# 优先执行
[ "aslfjdl" =~ a.*e ];
${i}			# 调用某个变量
$[ ]			# 对括号里的 公式进行运算

常见输出

1>
2>
&>			#混合输出
1&>2		# 把正确输出修改为错误输出
2&>1		# 把错误输出修改 正确输出

>>			# 追加
>			# 覆盖


------------------------------------------------------------
#重定向输入
cat >>  << EOF
内容1
内容1

EOF

查看当前系统所以变量

env
-------------------------------------------------------------------
XDG_SESSION_ID=5
HOSTNAME=master1
TERM=xterm-256color
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.12.155.180 53606 22
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=10.12.155.180 53606 10.12.155.146 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env

-------------------------------------------------------------------
echo $USER  # 可以用来输出 环境变量


su 切换

su - xiaoming
表示切换到用户xiaoming,并且同时切换到该用户的环境。这意味着系统会使用用户xiaoming的环境变量、工作目录,以及其他相关设置。这样可以模拟用户xiaoming登录系统后的环境。

su xiaoming
表示切换到用户xiaoming,但不会切换到该用户的环境,会保持当前环境。这样的切换可能会保留调用者的环境变量和工作目录。

别名alias

常用于太长记不住的命令

alias  asname = '{语句}'

前台执行 后台执行

# 前台放到后台
sleep 1000

ctrl + z

bg % {工作号}
bg % 1

# 放在后台执行
sleep  1000 &

# 可以退出信号

nohup sleep 1000 & 

	## 需要两个回车  


管道


ip a | grep inet | awk 'NR==3 {print $2}'| cut -d/ -f1 
# cut -d/ -f1  /用来分割字符串的  -d 是指定分隔符  -f 是指定打印 第几列

ip a | grep inet | awk 'NR==3 {print $2}'| awk -F'/' '{print $1}'
# awk 默认以空格为分隔符
# awk -F 可以指定分隔符号

xargs -a 、-exec

cat a.txt | xargs  -i cp {} /{目录}  

条件判断

;	# 多个简短的语句   一起执行
&&	# 前边执行 成功才会执行后边
||	# 前边执行 不成功才会执行后边

通配符

{}		# 集合{1..100},{a..z}
?		# 匹配的时候  代表一个字符 只代表一个字符
*		# 代表任意多个字符
[]		# 只匹配中括号里边的一个字符 a[xyz]b   会匹配到 axb ayb azb 
[!]		# 只匹配中括号里边的一个字符 a[!xyz]b   会匹配到不是这些 axb ayb azb
[0-9]	# 匹配到 0 到 9  一个数字
[0-9]+	# 匹配到 0 到 9  多个多个数字

查看历史历史命令

history
# 在此文件中配置
vim /etc/profile
	## 主要配置这个参数
	HISTSIZE=1000

上一条命令最后一条参数

esc + .		# 在命令含中执行
!$ 			# 可以用于脚本中

部分快捷健

ctrl  +  a  # 光标移动到 行首
ctrl  +  e 	# 光标移动到  行尾

shell 脚本规范

1、shell 脚本结尾 要使用 .sh  进行结尾(内容会高亮 看见文件就知道这是一个sh脚本)
2、定义解释器 (#!/bin/bash)

autocmd BufNewFile *.sh exec ":call AddTitleForShell()"
function  AddTitleForShell()
   call append(0,"#!/bin/bash")
   call append(1,"# *********************************************************#")
   call append(2,"#                                                          #")
   call append(3,"# * Author        : 白嫖一茶                               #")
   call append(4,"# * QQ邮箱址      : [email protected]                      #")
   call append(5,"# * Create time   : ".strftime("%Y-%m-%d %H:%M:%S")."                    #")
   call append(6,"# * Filename      : ".expand("%:t")."                                   #")
   call append(7,"# * Description   : This is Shell scripts                  #")
   call append(8,"#                                                          #")
   call append(9,"#                                                          #")
   call append(10,"# *********************************************************#")
endfunction
5、执行脚本的方法
sh  	{脚本文件}		# 不会影响当前父shell
bash 	{脚本文件}		# 不会影响当前父shell

.{脚本文件}				# 会影响当前父shell
source {脚本文件}		# 会影响当前父shell

./{脚本文件}

vscode:

可以使用vscode 安装 一下工具 方便编写脚本 以及测试
shell shell脚本编写常用命令 语法 shell 脚本工具推荐_第1张图片

安装插件

  • che中文
  • Remote-SSH
# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host {ip}
    HostName {ip}
    User {用户}

变量的类型 变量定义

当a脚本要调用 b脚本的时候 需要

# 自定义变量

variate="这是一个变量"			# 临时变量
export name=lisi				# 环境变量
set variate="这是一个变量"     	# 取消一个变量

# 获取 用户变量
read
read -p "请输入名字:" name
read -t  {10}    			## 超时时间
read -s					## 不要回显
	## 输入默认值
	{leval:{默认值}}


# 预定义变量  系统帮我们定义好的
$?			# 返回上一条 命令 执行结果 
$$			# 当前进程PID

# 查看环境变量
env 		# 查看环境
set 		# 查看所有变量
unset {变量名}	#删除变量 取消变量
export 		# 所有变量

/usr/local/mysql/:$PAHT  # 把自己安装的服务加入环境变量

# 位置参数 传参(执行脚本之后 给脚本传递的参数) 
$1 $2		# 执行的时候再代码后边添加一个参数// a.sh hello //echo  "你输入的是: $1"
$0			# 表示 整行
$#			# 位置参数的 总量
$@			# 统计位置参数的内容 ($1 获取位置变量 就是执行脚本呢 时 后边跟的参数) "$@" 还是一个一个来处理
$*			# 统计位置参数的内容 () "$*" 会当成一个整体的字符串来处理
$!			# 上一个后台进程 的PID

echo $0 			# 返回脚本  路径文件 
dirname $0		# 返回脚本命令
basename $0 		# 返回脚本名字

# 脚本路径
curPath=$(cd `dirname $0`;pwd)  #脚本路径做一个参数


#使用变量
echo ${variate}     			# {}花括号 防止中间有空格 
echo "$variate"					# 防止中间有空格 
echo '$variate'					# 把$ 当成字符串
执行	
echo '\$variate'				# 把$ 当成字符串执行	\$variate
echo "\$variate"				# 转义


# 常用环境变量
USER
UID
HOME
HOSTNAME
PWD
PATH

父shell 定义一个变量 ,子shell 也会继承这个变量

每次执行脚本都会 启动一个子shell

变量命名

  • 建议使用驼峰命名法
  • 不能以数字开头
  • 等号两边 不能有空格
  • 定义字符串的时候 用引号引起来

接入值(read)

# 获取 用户变量
read
read -p "请输入名字:" name
read -t      			## 超时时间
read -s					## 不要回显
	## 输入默认值
	{leval:{-默认值}}


参数

read -p "请输入名字:" name

{{变量}:{-默认值}} 		# 不会修改原有的值  此时变量还是空的
    # 案例
    {name :-刘德华} 		#

# 案例

{name :=刘德华}		# 对 name 进行复制

echo ${name:?名字不能为空}	# 如果name 是空 或者未设置

# 原有值不变,显示 word 内容
${变量:+word}


变量匹配

a="hello world"

echo ${a}

# 用来截取字符串 #* 再前边 开始截取
echo "${a#*l}"

# ##* 贪婪匹配 匹配到最后一个
echo "${a##*l}"

# 用来截取字符串 %{字符}* 从后边 开始截取
echo "${a%l*}"

# %%* 贪婪匹配 匹配到最后一个
echo "${a%%l*}"

# 替换输出
a=www.taobao.com
## 替换单个
echo ${a/taobao/baidu}

# 替换全部
echo ${a//a/w}


------------------------------------------------------------------------------
a=123456789

# 统计字符串的长度
echo ${#a}
       
       
# 从第二位之后开始截取 
echo ${a:2}

# 从第二位之后开始截取  到第四位
echo ${a:2:4}

# 从第二位之后开始截取  到倒数第二位
echo ${a:2:-2}

# 从头开始截取 到倒数第二位
echo ${a:0:-2}


命令回显

stty  -echo   	# 输入的时候-不显示命令 

引号

`{命令}`
$({命令})

ip -f inet a show dev ens33

awk&cut

uptime | awk '{print $3,$4,$5}'


awk  -F ','       			#指定分割符号  这里指定的是 ,

awk '{print $NF}'			# NF打印 总列数  总列书数嘛 最后一个也是总列数


cut -d- -f1					# 以- 为分隔符   第一列的值

一次性写入多行

# 可以使用 输入重定向
echo >> {文件名}  <<EOF
{line 1}
{line 2}
{line 3}
EOF

变量运算

# 运算符号
+
-
*
/
%		# 取余



# 如果$1 位置为空 那么 将0 赋值给 $1
x=${1:-0}
x=${1:-0}

# 运算
x=2
y=9
echo $(($x+$y))
echo $[$x+$y]

# 优先运算

echo $(((3+5)/2))

# expr
expr 2 + 3
expr 2 \* 3
expr 2 "*" 3
expr 2 / 3

# 获得一个随机数字
$RANDOM

$(($RANDOM % 10))  		# 取0-9
$(($RANDOM % 10 +1 ))  		# 取1-10

浮点数 运算

# 安装运算工具 bc
yum -y install bc1

# 使用方法 
echo $((10/3)) | bc

# 高级数学库 (直接把公式 给他即可)

echo $((2+4)) | bc -l

# 计算圆周率
echo "scale=10000;4 * a(1)" | bc -l



流程控制

条件判断 -test条件



# 判断真假 如果成立则返回 true  否则 返回 fless
tast  1 -gt 5

# 并且
-a

# 或者
-o

# 如果字符串是真的  则返回真
-n

# 如果字符串 是空的  则返回时真
-z
------------------------------------------------------------------------------
#判断数字

-eq 	# 等于
-ne 	# 不等于
-ge 	# 大于等于
-le  	# 小于等于
-gt  	# 大于
-lt		# 小于


------------------------------------------------------------------------------

# 判断文件是否存在  并且是个块设备
-b {文件}

test -b /dev/sdc

# 文件存在 且时一个目录
-d {文件}

# 文件存在并且时一个普通文件
-f {文件}

# 文件存在且是一个链接文件
-h {文件}


# 只要有 就返回真
-e {文件}


条件判断

# 双条件

if [-e /etc/passwd];then
	echo "文件存在"
else
	echo "文件不存在"
fi
------------------------------------------------------------------------------------
if [-e /etc/passwd];then
	echo "{如果文件存在则执行这里的代码}"
else

[[-e /etc/passwd]] && echo "{如果文件存在则执行这里的代码}"

------------------------------------------------------------------------------------
# 多条件判断
read -t 5 -p"请输入您的年龄:" age

if [ $age -gt 70 ] && [ $age -le 150 ];then 
	echo "老年"
elif [ $age -gt 40 ] && [ $age -le 70 ];then
	echo "中年"
elif [ $age -gt 18 ] && [ $age -le 40 ];then
	echo "青年"
elif [ $age -ge 0] && [ $age -le 18 ];then  # 大于等于
	echo "小屁孩"
else
	echo "噶了"
fi
-----------------------------------------------------------------------------------
# 
read -t 5 -p"请输入您的年龄:" score
case $score in
90)
	echo "清华"
	;;
60)
	echo "家里"
	;;
*)
	echo "不及格"
esac


循环

简单循环 (for)

 for i in {1..100}
do
	echo "$i"
done

# 范围支持
	## 空格 1 2 3 4
	## 逗号 {1,2,3,4}
	## tab  1	2	3
	##  for i in (cat  file.txt)
	##  for i in seq 100   			# 1到一百
	##  for i in seq 2 100   		# 2到一百
		##  for i in $(seq -w 2 100)   # 0 填充
-------------------------------------------------------------------------------

 for i in {a..z}
do
	echo "$i"
done
-------------------------------------------------------------------------------
# 两个集合破解
 for i in {a..z}{1..10}
do
	echo "$i"
done
-------------------------------------------------------------------------------
# 上上边的区别在于  这个次数是一个变量
i={次数}
for ((j=0; j<i; j++)); do
	执行多少次
done


双重循环

for i in {1..100}
do
    # clear
    line="<---------------------------------------------------------------------------------------------------->"
    for ((j=0; j<i; j++)); do
        line=$(echo "$line" | sed 's/-/=/')
    done
    echo "$line $i %"
    sleep 0.1
    # echo "$i"
    # echo "Hello, World!"
    
done

循环(while)

i=0
while [$i -lt 100]
do 
	a=$[$a+1]
	echo "$a"
done


---------------------------------------------------------------------------------------
# 循环打印某个文件 每一行  可以把数据放入某个文件中 进行批量处理
while read line
do 
	echo $line
done </etc/passwd 


-----------------------------------------------------------------------------------------------
# 这是一个死循环  : 这里直接跳过 
while :
do
	echo ""
done




let a++

i=0
while [$i -lt 100]
do 
	let a++
	echo "$a"
done

a=$[$a+1] ==  let a++

位置参数 左移


sh  a.sh  1 2

echo $1
shift 
echo $2

会输出两个1


跳过循环(continue、break)

 for i in {1..10}
do
	if [ $i eq 5 ];then
		continue
	fi
	echo "$i"
done
# shift 
# continue 跳过本次循环 进行下次循环
# break 结束整个循环 继续下一个程序
# exit 结束程序


函数(接口)

一次做好,多次使用。避免重复造轮子

  • 定义函数
  • 调用函数
  • 取消喊出
  • 函数传参

定义函数

# function 声明函数
# check  是函数的名字
# () 没有实际意义
# {} 函数体
function check(){
	echo 111
}
----------------------------------------------------------------
# 直接写 
check(){
	echo 111
}
----------------------------------------------------------------
# 本地调用

function check(){
	echo $1
}

check 111
----------------------------------------------------------------
# 远程调用(调用别的sh 文件的函数)
比如我要调用 上边文件的内容
source {函数文件路径}
check 222




用函数 查看ip

ip_list="www.baidu.com www.taobao123.com 10.12.155.149"

func(){
      for i in $ip_list
      do
      		ping -W1 -c1 $i &>/dev/null
      		if [ $? -eq 0 ]; then
       			echo $i
       		fi
       done
}



函数周期

a=10

func(){
	local		# 使用loacl 之后 变量在函数中的值 不会影响函数外边
	a=20
	echo $a
}
func

func(){
	ping -W1 -c1 www.baidu.com &>/dev/null
	if[ $? -eq 0 ];then
        echo "网络通常"
        return
	else 
		ping -W1 -c1 8.8.8.8 &>/dev/null
		if [ $? -eq 0 ];then
			echo "dns 配置错误"
			return  10
            else
                ping -W1 -c1 192.168.100.2&>/dev/null
                if [ $? -eq 0 ];then
                    echo "本地网络环境异常,请检查"
                    return 20
                else
                    echo "请检查 网关"
                    return 30
                fi
		fi
	fi

}
func
result=$?  # func 返回结果赋值给 result
if [ $result -eq 0 ];then
	echo "网络通畅"
elif [ $result -eq 10 ];then
	echo "DNS配置错误"
elif [ $result -eq 20 ];then
	echo "DNS配置错误"
elif [ $result -eq 30 ];then
	echo "DNS配置错误"




脚本测试

sh -n {脚本文件}  		# 判断语法上的错误

sh -x {脚本文件} 		# 不执行脚本 只是检查语法模式,将返回所有错误语法

sh -v {脚本文件}		#打印执行的过程

查看用户 ip

env | grep SSH

判断httpd 是否启动

systemctl status firewalld | grep Active | awk -F  {print $2}




随机生成密码

yum

mkpasswd 
 -l 10      	 #
 -c 5 			#





echo 输入颜色调试

echo

#!/bin/bash  
# 先定义一些颜色:

echo -e "\e[1;31m   LoveLo    LoveLo \e[0m"

red='\e[0;41m' # 红色  
RED='\e[1;31m'
green='\e[0;32m' # 绿色  
GREEN='\e[1;32m'
yellow='\e[5;43m' # 黄色  
YELLOW='\e[1;33m' 
blue='\e[0;34m' # 蓝色  
BLUE='\e[1;34m'
purple='\e[0;35m' # 紫色  
PURPLE='\e[1;35m'
cyan='\e[4;36m' # 蓝绿色  
CYAN='\e[1;36m'
WHITE='\e[1;37m' # 白色
 
NC='\e[0m' # 没有颜色

echo -e "${red}显示红色0 ${NC}"
echo -e "${RED}显示红色1 ${NC}"    
echo -e "${green}显示绿色0 ${NC}"
echo -e "${GREEN}显示绿色1 ${NC}"  
echo -e "${yellow}显示黄色0 ${NC}"
echo -e "${YELLOW}显示黄色1 ${NC}"    
echo -e "${cyan}显示蓝绿色0 ${NC}"
echo -e "${CYAN}显示蓝绿色1 ${NC}"

----------------------------------------------------------------

tput

# 语法
## 更换 背景颜色
tput  setab 2
## 更换 字体颜色
tput  setab 2

0 黑色
12 绿


5 是粉色 {杨红}

7 白色

闪烁
tput setab  颜色代码 //背景色
tput setaf  颜色代码  //字体颜色
tput sgr0   //颜色重置
==================================
数值	0	 1	  2	  3	  4	    5    6	 7
颜色	黑	红	绿	黄	蓝	洋红	黄	白
=====================================================================================================

echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"  //设置文本颜色
echo -e "\033[0;32m字符串\033[0m"     //设置文本为绿色,背景没有颜色
echo -e "\033[0;$(($RANDOM%7+30))m字符串\033[0m"      //随机生成一个颜色


其中“F“为字体颜色,编号为30-37,“B”为背景颜色,编号为40-47
F       B
30    40    黑色
31    41    红色
32    42    绿色
33    43    黄色
34    44    蓝色
35    45    紫红色
36    46    青蓝色
37    47    白色


'\E[33;5m 文本 \E[0m'     //33黄色,黄色闪烁



tput setab  颜色代码 //背景色
tput setaf  颜色代码  //字体颜色
tput sgr0   //颜色重置
==================================
数值	0	 1	  2	  3	  4	    5    6	 7
颜色	黑	红	绿	黄	蓝	洋红	黄	白


案例

判断脚本在某个位置

path=$(cd $(dirname $0) ;pwd)
[[ $path ="/opt/scripts" ]] && echo "执行成功" || echo "不在路径"

工具箱

#!/bin/bash
# *********************************************************#
#                                                          #
# * Author        : 白嫖一茶                               #
# * QQ邮箱址      : [email protected]                      #
# * Create time   : 2023-12-28 17:22:18                    #
# * Filename      : jiegeTools.sh                                   #
# * Description   : This is Shell scripts                  #
#                                                          #
#                                                          #
# *********************************************************#
while :
do
	cat <<EOF
	@===========================================================@
	@                                                           @
	@            Welcome use system tools                       @
	@            1.Config aliyun_yum                            @
	@            2.System init                                  @
	@            3.source install mysql                         @
	@            4.source install PHP                           @
	@            6.source install nginx                         @
	@            0.退出                                         @
	@                                                           @
	@===========================================================@
EOF

	read -p "请输入" num
	case $num in
	0)
		exit 0
		;;
	1)
		source ./system-libs/config_aliyun.sh
		if [ $aliyun_yum_code -eq 0 ]; then	
		fi
		echo "开始执行 条件一"
		;;
	2)
		echo "开始执行 条件二"
		;;
	3)
		:     # 这里是一个占位符,表示你不用管我
		;;
	4)
		echo "未开发"
		exit 1   # 控制返回
		;;
	5)
		echo "未开发"
		exit 1   # 控制返回
		;;
	6)
		echo "未开发"
		exit 1   # 控制返回
		;;
	*)
	esac
done


随机密码工具箱


#! /bin/bash
cat <<EOF
==========================================================
            1 条件 1
            1 条件 2
            1 条件 3
==========================================================
EOF

read -p "请输入" num
case $num in
1)
	echo "开始执行 条件一"
	;;
2)
	echo "开始执行 条件二"
	;;
2)
	:     # 这里是一个占位符,表示你不用管我
	;;
4)
	echo "未开发"
	exit 1   # 控制返回
*)
esac





变量嵌套


name=kobe
kobe=24

eval echo "$""$name"


# 先获取 name 的值,再进行构造, 从而获取到的值

获取主机信息脚本

  • 1、编写规范、注意缩进、解释器
  • 2、收集信息、内存、磁盘、用户、时间、IP
  • 3、输出信息
#! bin/bash

# 1、编写规范、注意缩进、解释器
# 2、收集信息、内存、磁盘、用户、时间、IP
# 获取内存
echo -e "剩余内存:`free -m | awk '/^Mem/{print $4}'`MB"

		## 修改颜色
		echo -e "\033[31m文本\033[0m"
		
		## 多种颜色 获取一个随机数
		echo $[$RANDOM % 7 + 31]

# 根分区百分比
df -hT | awk '/\/$/{print $6}'


# 用户
w -h
w -h | awk '{print $1}'|sort |uniq -c | awk '{print $2}'


# 客户端IP

echo $SSH_CLIENT | awk 'print $1' 

curl http://httpbin.org/ip

# 3、输出信息


-------------------------------------------------------------------------
# 编写一个shell脚本,用于搜集其执行主机的信息,打印结果如下: 
    # [root@tiger tmp]# ./test.sh
    # 2012年 05月 24日 星期四 17:07:45 CST
    # 当前的用户为 root
    # 当前用户的宿主目录为 /root 用户的标识为 0
    # 主机名称为 newrain
    # 网卡的IP地址为 192.168.1.106
    
    
    





主机存活

#!/bin/bash
wangduan='10.12.155'
for i in {1..254}
do
	ping -W -c1 $wangduan$1 > /dev/null
	if [$? -eq 0];then
		echo "$wangduan$1" >> ok.txt
	else
		echo "$wangduan$1" >> no.txt
	fi
done

$? 返回的是 0 则代表上一条命令

创建十个用户

# 创建十个用户 截取uuid 第一段为 密码  把密码保存到一个文件中
# user_01  -- user_10
uname=user_
isPasswd="密码是"
for i in $(seq -w 10)
do
    echo $uname$i
    useradd $uname$i 
    
    myPasswd=$(echo `uuidgen` | awk -F "-" '{print $1}')
    echo $myPasswd | passwd  --stdin $uname$i

    echo $uname$i$isPasswd$myPasswd >> ./myP.txt
	# userdel -r $uname$i  # 删除用户
done


99乘法表

for i in $(seq 9)
do
    for j in $(seq 9)
    do
        echo -ne "$i * $j = $(($i * $j))\t"
    done
    echo ''
done

echo -----------------------------------------------------------------------
# 三角

for i in $(seq 9)
do
    
    for j in $(seq $i)
    do
        echo -ne "$i * $j = $(($i * $j))\t"
    done
    echo ''
done

vim 打开显示信息

cat > /root/.vimrc << EOF
set ignorecase
set cursorline
set autoindent
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
        if expand("%:e") == 'sh'
        call setline(1,"#!/bin/bash")
        call setline(2,"#")
        call setline(3,"#**************************************")
        call setline(4,"#Author:        liujie")
        call setline(5,"#QQ:            945225432")
        call setline(6,"#Date:          ".strftime("%Y-%m-%d"))
        call setline(7,"#FileName       ".expand("%"))
        call setline(8,"#**************************************")
        call setline(9,"")
        endif
endfunc
autocmd BufNewFile * normal G
EOF

回的是 0 则代表上一条命令

创建十个用户

# 创建十个用户 截取uuid 第一段为 密码  把密码保存到一个文件中
# user_01  -- user_10
uname=user_
isPasswd="密码是"
for i in $(seq -w 10)
do
    echo $uname$i
    useradd $uname$i 
    
    myPasswd=$(echo `uuidgen` | awk -F "-" '{print $1}')
    echo $myPasswd | passwd  --stdin $uname$i

    echo $uname$i$isPasswd$myPasswd >> ./myP.txt
	# userdel -r $uname$i  # 删除用户
done


99乘法表

for i in $(seq 9)
do
    for j in $(seq 9)
    do
        echo -ne "$i * $j = $(($i * $j))\t"
    done
    echo ''
done

echo -----------------------------------------------------------------------
# 三角

for i in $(seq 9)
do
    
    for j in $(seq $i)
    do
        echo -ne "$i * $j = $(($i * $j))\t"
    done
    echo ''
done

vim 打开显示信息

cat > /root/.vimrc << EOF
set ignorecase
set cursorline
set autoindent
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
        if expand("%:e") == 'sh'
        call setline(1,"#!/bin/bash")
        call setline(2,"#")
        call setline(3,"#**************************************")
        call setline(4,"#Author:        liujie")
        call setline(5,"#QQ:            945225432")
        call setline(6,"#Date:          ".strftime("%Y-%m-%d"))
        call setline(7,"#FileName       ".expand("%"))
        call setline(8,"#**************************************")
        call setline(9,"")
        endif
endfunc
autocmd BufNewFile * normal G
EOF

未完结

你可能感兴趣的:(shell脚本,bash)