shell分为两种使用方式:
- 交互: 登录 执行命令 退出
- 非交互: 执行某个文件, 文件中都是一推命令, 整个文件从上往下依次执行.
Shell脚本能做什么,标准:
- 1.安装方式一致
- 2.安装路径一致
- 3.目录结构一致
- 4.日志格式一致
- 5.脚本路径一致
- 能将平时操作脚本化,流程化,自动化 ITIL
- ppt 人 流程 技术/工具
- 备份、监控、自动化上线、约束标准
shell脚本需要的预备知识
shell脚本如何才能学好 思路 练习
Shell脚本编写规范、执行方式。
- 执行方式分为两种:
- 1.加执行权限 ./script_filename.sh
- 2.通过bash直接翻译 bash script_filename.sh
-
#!/usr/bin/bash 加与不加区别在哪?
1.如果你明确清楚这是一个什么类型的脚本,直接调用对应的解释器执行,没有影响?
2.如果你不清楚是什么类型的脚本, 直接使用./执行,那么会读取该脚本的第一行
如果第一行是#!/usr/bin/bash 或者 没有写该行,那么都将使用默认的bash翻译
问题: 如果我是一个python脚本,没有写开头,那么执行一定会报错
因为默认查找的是bash解释器,而我的文件需要用python解释器来翻译. -
添加命令解释器的几种方式:
#!/usr/bin/bash
#!/usr/bin/sh
#!/usr/bin/env bash
#!/usr/bin/env python
1.什么是变量
2.定义变量规范
- 1.大写开头,后面小写或数字都ok
- 2.变量具体一定的含义
- 3.注意 变量的写法 仅支持 a=1 不支持 a = 1
3.自定义变量
- var="hello world"
- echo $var
- echo ${var}_log
$* 和 $@ 的区别?
可以看到不加引号时,二者都是返回传入的参数,但加了引号后,此时$*把参数作为一个字符串整体(单字符串)返回,$@把每个参数作为一个字符串返回
需求1:通过位置传参方式, 创建 Linux 系统账户及密码,执行 var1.sh username password
[root@manager variables]# cat var04.sh
#!/bin/bash useradd $1 echo "$2" | passwd --stdin $1 [root@manager variables]# sh var04 username password
[root@manager variables]# cat var05.sh #!/bin/bash if [ $# -ne 2 ];then echo "USAGE: $0 请传递两个参数 [ username | password ]" exit fi useradd $1 echo "$2" | passwd --stdin $1
[root@manager variables]# cat var08.sh #!/bin/bash echo "$(hostnamectl |awk -F ":" '/Operating System:/ {print $2}')" echo "Kernel $(uname -r) on an $(uname -m)" read -p "$(hostname) Login: " acc read -s -t50 -p "Password: " pw echo "" echo "你输入的用户名: $acc 你输入的密码是: $pw"
需求4:使用 read编写一个备份脚本,需要用户传递2个参数,源和目标。
[root@manager variables]# cat var09.sh #!/bin/bash echo "----------请按照如下提示输入---------------" read -p "请输入你要备份的源文件或者源目录: " Source read -p "请输入你要备份的目录位置是哪里: " Dest echo -e " 你要备份的源是 $Source 你要备份的目标是: $Dest" read -p "你确定要备份吗? [ y | n ] " Action if [ $Action == "y" ];then cp -rpv $Source $Dest fi
[root@manager variables]# cat var10.sh #!/bin/bash read -p "请输入需要探测的IP地址: " ip ping -W1 -c1 "$ip" &>/dev/null if [ $? -eq 0 ];then echo "$ip" is ok... else echo "$ip" is err... fi
[root@manager variables]# cat var11.sh #!/bin/bash Hostname=$(hostname) echo "当前的主机名称是: ${Hostname}" read -p "请输入新的主机名称: " new_host read -p "你确定要将 ${Hostname} 变更为 ${new_host} 吗? [ y | n ] " Action if [ $Action == "y" ];then hostname ${new_host} hostnamectl set-hostname ${new_host} echo "你的主机名称已修改为 ${new_host} " fi
变量匹配方式
[root@manager ~]# url=www.sina.com.cn [root@manager ~]# echo $url www.sina.com.cn [root@manager ~]# echo $url | awk -F '.' '{print $2,$3,$4}' sina com cn [root@manager ~]# echo ${url} www.sina.com.cn ------------# [root@manager ~]# echo ${url#*.} #从头开始匹配,最短匹配 sina.com.cn [root@manager ~]# echo ${url##*.} #从头开始匹配,最长匹配 cn ------------% [root@manager ~]# echo ${url%.*} www.sina.com [root@manager ~]# echo ${url%%.*} www -------------/ [root@manager ~]# echo ${url/c/C} www.sina.Com.cn [root@manager ~]# echo ${url//c/C} www.sina.Com.Cn
需求1:如何替换 $PATH 中的/bin/替换为/BIN/
[root@manager ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@manager ~]# echo ${PATH//bin/BIN}
[root@manager variables]# cat var12.sh #!/bin/bash string="Bigdata process is Hadoop, Hadoop is open source project" echo $string echo "1)、打印string长度" echo "2)、删除字符串中所有的Hadoop" echo "3)、替换第一个Hadoop为Linux" echo "4)、替换全部Hadoop为Linux" read -p "请输入对应的选项 [ 1 | 2 | 3 | 4 | q ] " Action if [ $Action -eq 1 ];then echo "他的长度是: ${#string}" fi if [ $Action -eq 2 ];then echo "${string//Hadoop/}" fi if [ $Action -eq 3 ];then echo ${string/Hadoop/Linux} fi if [ $Action -eq 4 ];then echo ${string//Hadoop/Linux} fi
mem_use=$(free -m | awk '/^Mem/ {print $3/$2*100}') if [ ${mem_use%.*} -ge 10 ];then echo "你的内存已经超过了80% 目前的内存使用状态是 ${mem_use}%" fi
需求4:根据系统时间,打印今年和明年时间。
[root@manager variables]# cat var14.sh #!/bin/bash echo "今年的时间是: $(date +%Y)" echo "明年的时间是: $(( $(date +%Y) +1 ))"
需求5:根据系统时间获取今年还剩下多少星期,已经过了多少星期。思路如下: date +%j 已经过了多少天
一年有365天 已经过了 301 = 还剩下 365-301 = 64 / 7 = 还剩下多少周 已经过了 301 天 / 7 = 已经过了多少周
[root@manager variables]# cat var15.sh #!/bin/bash Date=$(date +%j) echo "今年已经过了 ${Date} 天" echo "今年已经过了 $[ ${Date} /7 ] 周" echo "今年还剩下 $[ ( 365 - ${Date} ) / 7 ] 周" echo "从现在距离下一个新年还有 $[ 365 - ${Date} ] 天"
[root@manager variables]# cat var16.sh #!/bin/bash echo "$1 + $2 = $[ $1 + $2 ]" echo "$1 - $2 = $[ $1 - $2 ]" echo "$1 * $2 = $[ $1 * $2 ]" echo "$1 / $2 = $[ $1 / $2 ]" echo "$1 % $2 = $[ $1 % $2 ]"