shell 脚本
计算机语言
Shebang 定义解释器
主要定义,您的脚本是用什么语言写的
#!/usr/bin/python //定义这是一个python语言#!/bin/bash //定义这是一个shell语言
echo @SHELL
我们执行的 linux 命令的时候,其实是使用 /bin/bash 这个二进制文件对 命令文件执行的。
路径问题处理
执行脚本的时候,脚本中的路径会以用户当前位置开始计算
所以 推荐使用根路径 来对文件进行编辑pwd
echo $(dirname $0) && echo "执行成功"echo /root/k/king/a.shcat /root/k/king/a.sh # 执行成功# 处理路径问题echo $(dirname $0)/king/a.shcat /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.shbasename c
父进程调用子进程 source
# 父进程 调用子进程
# 如果要调用 子进程脚本
需要 使用
source
拒绝 ctrl + c
添加 trap : INT 之后则此进程不可以使用 ctrl + c 中断
trap : INTfor i in {1..100}
do trap : INTi=$[ $i +1 ]echo "$i"sleep 1
done
括号使用
[[ ]] # 判断
(()) == [] # 判断
() == `` # 优先执行
[ "aslfjdl" =~ a.*e ];
${i} # 调用某个变量
$[ ] # 对括号里的 公式进行运算
常见输出
1>
2>
&> #混合输出
1&>2 # 把正确输出修改为错误输出
2&>1 # 把错误输出修改 正确输出>> # 追加
> # 覆盖------------------------------------------------------------
#重定向输入
cat >> << EOF
内容1
内容1EOF
查看当前系统所以变量
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 1000ctrl + zbg % {工作号}
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邮箱址 : 2534824121@qq.com #")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 安装 一下工具 方便编写脚本 以及测试
安装插件
- 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 获取位置变量 就是执行脚本呢 时 后边跟的参数) "$@" 还是一个一个来处理
$* # 统计位置参数的内容 () "$*" 会当成一个整体的字符串来处理
$! # 上一个后台进程 的PIDecho $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];thenecho "文件存在"
elseecho "文件不存在"
fi
------------------------------------------------------------------------------------
if [-e /etc/passwd];thenecho "{如果文件存在则执行这里的代码}"
else[[-e /etc/passwd]] && echo "{如果文件存在则执行这里的代码}"------------------------------------------------------------------------------------
# 多条件判断
read -t 5 -p"请输入您的年龄:" ageif [ $age -gt 70 ] && [ $age -le 150 ];then echo "老年"
elif [ $age -gt 40 ] && [ $age -le 70 ];thenecho "中年"
elif [ $age -gt 18 ] && [ $age -le 40 ];thenecho "青年"
elif [ $age -ge 0] && [ $age -le 18 ];then # 大于等于echo "小屁孩"
elseecho "噶了"
fi
-----------------------------------------------------------------------------------
#
read -t 5 -p"请输入您的年龄:" score
case $score in
90)echo "清华";;
60)echo "家里";;
*)echo "不及格"
esac
循环
简单循环 (for)
for i in {1..100}
doecho "$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}
doecho "$i"
done
-------------------------------------------------------------------------------
# 两个集合破解for i in {a..z}{1..10}
doecho "$i"
done
-------------------------------------------------------------------------------
# 上上边的区别在于 这个次数是一个变量
i={次数}
for ((j=0; j<i; j++)); do执行多少次
done
双重循环
for i in {1..100}
do# clearline="<---------------------------------------------------------------------------------------------------->"for ((j=0; j<i; j++)); doline=$(echo "$line" | sed 's/-/=/')doneecho "$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 :
doecho ""
done
let a++
i=0
while [$i -lt 100]
do let a++echo "$a"
donea=$[$a+1] == let a++
位置参数 左移
sh a.sh 1 2echo $1
shift
echo $2会输出两个1
跳过循环(continue、break)
for i in {1..10}
doif [ $i eq 5 ];thencontinuefiecho "$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_listdoping -W1 -c1 $i &>/dev/nullif [ $? -eq 0 ]; thenecho $ifidone
}
函数周期
a=10func(){local # 使用loacl 之后 变量在函数中的值 不会影响函数外边a=20echo $a
}
func
func(){ping -W1 -c1 www.baidu.com &>/dev/nullif[ $? -eq 0 ];thenecho "网络通常"returnelse ping -W1 -c1 8.8.8.8 &>/dev/nullif [ $? -eq 0 ];thenecho "dns 配置错误"return 10elseping -W1 -c1 192.168.100.2&>/dev/nullif [ $? -eq 0 ];thenecho "本地网络环境异常,请检查"return 20elseecho "请检查 网关"return 30fififi}
func
result=$? # func 返回结果赋值给 result
if [ $result -eq 0 ];thenecho "网络通畅"
elif [ $result -eq 10 ];thenecho "DNS配置错误"
elif [ $result -eq 20 ];thenecho "DNS配置错误"
elif [ $result -eq 30 ];thenecho "DNS配置错误"
脚本测试
sh -n {脚本文件} # 判断语法上的错误sh -x {脚本文件} # 不执行脚本 只是检查语法模式,将返回所有错误语法sh -v {脚本文件} #打印执行的过程
查看用户 ip
env | grep SSH
判断httpd 是否启动
systemctl status firewalld | grep Active | awk -F {print $2}
随机生成密码
yummkpasswd -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 20 黑色
1 红
2 绿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邮箱址 : 2534824121@qq.com #
# * Create time : 2023-12-28 17:22:18 #
# * Filename : jiegeTools.sh #
# * Description : This is Shell scripts #
# #
# #
# *********************************************************#
while :
docat <<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.退出 @@ @@===========================================================@
EOFread -p "请输入" numcase $num in0)exit 0;;1)source ./system-libs/config_aliyun.shif [ $aliyun_yum_code -eq 0 ]; then fiecho "开始执行 条件一";;2)echo "开始执行 条件二";;3): # 这里是一个占位符,表示你不用管我;;4)echo "未开发"exit 1 # 控制返回;;5)echo "未开发"exit 1 # 控制返回;;6)echo "未开发"exit 1 # 控制返回;;*)esac
done
随机密码工具箱
#! /bin/bash
cat <<EOF
==========================================================1 条件 11 条件 21 条件 3
==========================================================
EOFread -p "请输入" num
case $num in
1)echo "开始执行 条件一";;
2)echo "开始执行 条件二";;
2): # 这里是一个占位符,表示你不用管我;;
4)echo "未开发"exit 1 # 控制返回
*)
esac
变量嵌套
name=kobe
kobe=24eval 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}'# 客户端IPecho $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}
doping -W -c1 $wangduan$1 > /dev/nullif [$? -eq 0];thenecho "$wangduan$1" >> ok.txtelseecho "$wangduan$1" >> no.txtfi
done$? 返回的是 0 则代表上一条命令
创建十个用户
# 创建十个用户 截取uuid 第一段为 密码 把密码保存到一个文件中
# user_01 -- user_10
uname=user_
isPasswd="密码是"
for i in $(seq -w 10)
doecho $uname$iuseradd $uname$i myPasswd=$(echo `uuidgen` | awk -F "-" '{print $1}')echo $myPasswd | passwd --stdin $uname$iecho $uname$i$isPasswd$myPasswd >> ./myP.txt# userdel -r $uname$i # 删除用户
done
99乘法表
for i in $(seq 9)
dofor j in $(seq 9)doecho -ne "$i * $j = $(($i * $j))\t"doneecho ''
doneecho -----------------------------------------------------------------------
# 三角for i in $(seq 9)
dofor j in $(seq $i)doecho -ne "$i * $j = $(($i * $j))\t"doneecho ''
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)
doecho $uname$iuseradd $uname$i myPasswd=$(echo `uuidgen` | awk -F "-" '{print $1}')echo $myPasswd | passwd --stdin $uname$iecho $uname$i$isPasswd$myPasswd >> ./myP.txt# userdel -r $uname$i # 删除用户
done
99乘法表
for i in $(seq 9)
dofor j in $(seq 9)doecho -ne "$i * $j = $(($i * $j))\t"doneecho ''
doneecho -----------------------------------------------------------------------
# 三角for i in $(seq 9)
dofor j in $(seq $i)doecho -ne "$i * $j = $(($i * $j))\t"doneecho ''
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
未完结