Linux shell 编程学习笔记

一直以来都很像系统的学习一下 shell 脚本,以便方便的高效的管理服务器。

这次难得有时间和条件来学习,所以做好笔记。

一:shell 能做什么

Linux shell 编程学习笔记_第1张图片

 二: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 执行

几种程序语言执行的对比

Linux shell 编程学习笔记_第2张图片

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

Linux shell 编程学习笔记_第3张图片

 Linux shell 编程学习笔记_第4张图片

Linux shell 编程学习笔记_第5张图片

#命令历史记忆功能
#上下键 查看上一条和下一条命令
#!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 

#输入输出重定向

Linux shell 编程学习笔记_第6张图片

#注意 shell 不支持 ^开头查找,比如
ls ^f*

# (shell) 在子 shell 命令中执行不会改变当前环境变量

#快捷复制,将指定的文件改名
cp -rv /root/aaa.sh(,.old)

#使用 \ 转义,在命令行中会转义回车,就可以多行输入

#输出带有颜色,并重置 ,背景色是从40m 开始
echo -e "\e[1;31m This is a red text.\e[0m"

 变量 脚本中使用变量

Linux shell 编程学习笔记_第7张图片

 


#!/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 命令来查找所有环境变量

变量、位置及预定义变量

Linux shell 编程学习笔记_第8张图片


#来一个简单范例
#!/usr/bin/bash
#如果用户没有加参数
if [ $# -eq 0 ]
    echo "usage: `basename $0` file"
fi

变量的赋值方式

Linux shell 编程学习笔记_第9张图片

#linux 内置了很都实用的环境变量,比如
$UID
$USER
$HOME
$PWD
........

#Linux 没有变量类型和 PHP 一样,默认为字符串

#脚本中执行的两种方式

today=`date+%F`
today=$(date+%F)

Linux shell 编程学习笔记_第10张图片

 变量的运算

Linux shell 编程学习笔记_第11张图片

 

你可能感兴趣的:(linux)