一直以来都很像系统的学习一下 shell 脚本,以便方便的高效的管理服务器。
这次难得有时间和条件来学习,所以做好笔记。
一:shell 能做什么
二:shell 脚本的几种执行方式,我们创建文件 start.sh,并且赋予 执行权限
chomd +x start.sh
#然后可以通过以下命令执行
#相对路径,或者绝对路径
./start.sh
#一个脚本范例,&& 表示的是逻辑判断,表示前面执行成功才会执行
#当然也可以用分号,但是不代表逻辑判断,前面执行成功与否都会执行
# || 代表逻辑否,就是前面失败执行
ping -c1 8.8.8.8 && echo "the network is ok" || echo "network is down"
这样的话,会附带执行结果输出如下:
PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
64 bytes from 114.114.114.114: icmp_seq=1 ttl=78 time=31.4 ms
--- 114.114.114.114 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 31.484/31.484/31.484/0.000 ms
network is down
但是如果我们不想在输出中看到执行过程,我们可以写出如下:
ping -c1 114.114.114.114 &>/dev/null && echo "success 163"
执行脚本的方式如下几种:
bash start.sh
sh start.sh
./start.sh
绝对路径执行
#我们可以通过 which bash 来查询执行脚本位置
但是我们无法通过 python 命令来执行,原因如下:
#我们使用命令来查看脚本环境路径
which bash
/usr/bin/bash
which python
/usr/bin/python
which perl
/usr/bin/perl
如果脚本默认顶部指定执行环境,那么默认采用的是 bash 环境
#默认指定,官方说法叫做 SheBang ,定义此脚本用哪个解释器来执行
#切记,只有第一行才是解释器
#!/usr/bin/bash
#如果需要 python 命令来执行,那么需要这样写
#!/usr/bin/python
#范例
#!/usr/bin/python
print('This is python shell')
#如果不指定解释器,默认为 shell 执行
几种程序语言执行的对比
Bash 中调用 python Expect
#解析来我们来合并两段代码
cat python.sh >> start.sh
#得到如下代码
#!/bin/bash
ping -c1 114.114.114.114 &>/dev/null && echo "success 163"
#!/usr/bin/python
print('This is python shell')
#那么该怎么执行这段代码呢,可以将期间的 python 代码这样写
#技巧: -EOF 前面的 - 支持下面的缩进
/usr/bin/python <<-EOF
print('This is python shell')
EOF
#在 python 中无法使用 shell 命令,python 语法比较严谨,会当成关键字
关于执行脚本已经伴随脚本中目录的改变,范例如下:
#新建脚本 bash.sh 并写入
#!/usr/bin/bash
cd /home
ls
#然后给予权限
#先使用该命令执行
./bash.sh
#成功执行
#然后使用以下执行
. bash.sh
#我们会发现,当前的目录已经产生变化
#第一个是新开的 shell 子进程中进行,第二个是在当前 shell 执行
#我们在写一个例子,新增别名
vim /root/.bashrc
#在不执行 source 下怎么生效呢,可以使用以下
. /root/bashrc 或者 . ~/.bashrc
Shell 特性 Nologin
#命令历史记忆功能
#上下键 查看上一条和下一条命令
#!number 先用 history 查看历史命令记录,然后在对应序号输入 !+number
#!string 历史记录开头 比如输入 !d 会显示 !date
#!$ 上一个命令的最后参数
#!! 上一个命令,和方向键上一样,主要在脚本中使用
# ctrl + R
#别名功能
#alias
#unalias cp 取消别名
#快捷键
Ctrl + R 搜索一个历史命令
Ctrl + D 退出
Ctrl + A 光标移动最前
Ctrl + E 光标移动到最后
Ctrl + L
Ctrl + U 快速删除到开头
Ctrl + S 锁屏,盲打
Ctrl + K 快速删除到结尾
Ctrl + y
#输入输出重定向
#注意 shell 不支持 ^开头查找,比如
ls ^f*
# (shell) 在子 shell 命令中执行不会改变当前环境变量
#快捷复制,将指定的文件改名
cp -rv /root/aaa.sh(,.old)
#使用 \ 转义,在命令行中会转义回车,就可以多行输入
#输出带有颜色,并重置 ,背景色是从40m 开始
echo -e "\e[1;31m This is a red text.\e[0m"
变量 脚本中使用变量
#!/usr/bin/bash
ip=114.114.114.114
ping -c1 $ip &>/dev/null && echo "$ip is up" || echo "$ip is down"
#变量写法
#!/usr/bin/bash
ip="8.8.8.8"
if ping -c1 $ip &>/dev/null
then
echo "$ip is up"
else
echo "$ip id down"
fi
#窗口读入写法
#!/usr/bin/bash
read -p "Please input a ip: " ip
ping -c1 $ip &>/dev/null && echo "$ip is up" || echo "$ip is down"
#参数传递,$1 开始接受参数
#/usr/bin/bash
ping -c1 $q &>/dev/null
if [ $? -eq 0 ]
then
echo "$1 is up"
else
echo "$1 is down'
fi
#执行
./ping.sh 8.8.8.8
环境变量及自定义变量
#环境变量和自定义变量,作用域和其他语言相同
a=1
export a
#转换成环境变量也可以在写在一个脚本中,对变量加上 export 然后用 source 执行脚本
#常见使用方式为在一个脚本中引入一个脚本,比如 shell 在同一脚本下使用
#通过 . 的方式加载
. bash.sh
#我们安装了某些软件包,需要在环境变量中使用,我们需要添加环境变量
vi /etc/profile
#然后在底部
PATH=$PATH:/new/bin
export PATH
#然后执行
sorce /etc/profile
#我们可以输入 env 命令来查找所有环境变量
变量、位置及预定义变量
#来一个简单范例
#!/usr/bin/bash
#如果用户没有加参数
if [ $# -eq 0 ]
echo "usage: `basename $0` file"
fi
变量的赋值方式
#linux 内置了很都实用的环境变量,比如
$UID
$USER
$HOME
$PWD
........
#Linux 没有变量类型和 PHP 一样,默认为字符串
#脚本中执行的两种方式
today=`date+%F`
today=$(date+%F)
变量的运算