
撰写本文是对我自己的学习和使用的总结. 写作不是很好. 如有任何疑问,请沟通.
Github地址:
Shell指的是应用程序. 该应用程序提供了一个接口,用户可以通过该接口访问操作系统内核的服务. Shell脚本是为Shell编写的脚本程序. 我们经常说的shell通常是一个shell脚本.
Shell与Java,php,Python编程相同,只要您具有可以编写代码的文本编辑器和可以解释和执行的脚本解释器即可.
Mac OS,Linux带有外壳解释器,Windows则比较麻烦,因为Win7 Professional和Ultimate版本默认情况下安装了PowerShell,而Standard和Home版本中没有安装. 为了方便起见,建议安装cygwin
PHP和Python是高级编程语言,但是您也可以执行Shell编程,只要您拥有解释器shell 编程 for,您就可以将其用作脚本编程
以下是Python Shell脚本的示例(假设文件名为op_python_base.py):
#!/usr/bin/env python3 //告诉Python从系统环境中找python
# -*- coding: utf-8 -*- //设置为UTF-8编码
for index in range(10):
print(index);
来源: op_python_base
以下是一个PHP Shell脚本示例(假设文件名为op_php_base.php):
#!/usr/bin/php
<?php
for($i=0 ;$i<10; $i++){
echo $i;
}
?>
来源: op_php_base
由于PHP和Python均可用于脚本编写,因此为什么要学习奇怪而晦涩的Shell?原因有很多.
sh: Bourne shell,POSIX(操作系统接口)标准的shell解释器,其二进制文件路径通常为/ bin / sh
bash: Bash是Bourne shell的替代产品,属于GNU工程. 二进制文件路径通常是/ bin / bash
我相信已经编写了代码的童鞋应该熟悉以下代码,而不是陌生的(假设文件名为op_base.sh):
#!/usr/bin/env bash
mkdir code
cd code
for ((i=0; i<3; i++)); do
touch test_${i}.txt
echo "shell很简单" >> test_${i}.txt
done
第一行: 从系统路径中找到指定脚本的解释器
第二行: 创建一个名为code的文件夹
第三行: 输入创建的文件夹

第四行: 循环3次
第四行: 创建一个文件
第五行: 将信息写入创建的文件
第6行: 结束循环
mkdir,touch,cd,touch,echo都是系统命令,可以直接从命令行执行.
for,do,done是shell脚本语言中for循环的语法
来源: op_base.sh
创建一个扩展名为sh的新文件(sh代表shell). 该扩展名不会影响脚本的执行. 很高兴知道这个名字. 如果使用php,则扩展名为php. 如果您使用Python,则扩展名为python
第一行如下:
#!/usr/bin/php
#!/usr/bin/env python3
#!/usr/bin/env bash
#! ”是一个约定标记,它告诉系统该脚本需要执行什么解释器.
/ env是系统的PATH目录查找
chmod +x op_base.sh
./op_base.sh
第一行设置op_base.sh的可执行权限
第二行执行op_base.sh
/bin/sh op_base.sh
定义变量时,无需在变量名称前添加符号. 与Python相同,但是您需要在PHP中添加一个变量.
my_name="jack"
my_name='jack';
ps: 变量名和等号之间不能有空格,并且变量后不能有空格;
Shell引用类似于PHP. 字符串可以单引号或双引号.

单引号字符串的限制:
单引号中的任何字符都将按原样输出shell 编程 for,单引号字符串中的变量无效
单引号不能出现在单引号中(即使在对单引号使用转义字符之后也是如此
双引号:
双引号中可以包含变量
转义字符可以用双引号引起来
但是Python中单引号和双引号之间没有区别,但是Python也有三个引号,并且三个引号内的字符也不会转义
对于已定义的变量,适合在它们前面添加它们,例如: ¨G6Gps: 变量名和等号之间不能有空格,并且变量后不能有空格. 引号或双引号单引号字符串限制:
echo $my_name
echo ${my_name}
变量名外的花括号是可选的. 可以添加或不添加. 建议使用第二种形式.
以“#”开头的行是注释,解释器将忽略它们.
sh中没有多行注释,您只能在每行中添加#号. 就是这样:
#--------------------------------------------
# Author: jack
#
# Notes: 10分钟入门Shell脚本编程
#
# Project home page:
# https://github.com/hi-dhl/fast_guides
#--------------------------------------------
字符串可以是单引号还是双引号. 单引号和双引号之间的区别类似于PHP
与其他语言不同,Shell具有php和python. 有许多数据类型. Shell中常用的数据类型是字符串数字和字符串. (ps: 除了数字和字符串之外,没有其他易于使用的了,哈哈)
单引号字符串的限制:
单引号中的任何字符都将按原样输出,单引号字符串中的变量无效
单引号不能出现在单引号中(即使在对单引号使用转义字符之后也是如此
双引号:
双引号中可以包含变量

转义字符可以用双引号引起来
my_name="jack";
my_age="20岁"
echo $my_name $my_age
echo $my_name$my_age echo ${#my_name} echo ${my_name:0:2}
来源: op_str.sh
在外壳中,括号用于表示数组,并且数组元素由“空格”符号分隔. 定义数组的一般形式是:
name=(name1 name2 name3)
您还可以分别定义数组的每个组件:
ary[0]=name1
ary[1]=name2
ary[3]=name3
ps: 可以省略连续的下标,并且下标的范围不受限制.
读取数组元素值的一般格式为:
${数组名[下标]}
示例:
echo ${name[0]}
使用@符号获取数组中的所有元素,例如:
echo ${name[@]}
获取数组长度的方法与获取字符串长度的方法相同,例如:
# 取得数组元素的个数
length=${#name[@]}
echo $length
# 或者
length=${#name[*]}
echo $length
# 取得数组单个元素的长度
lengthn=${#name[n]}
echo $length
来源: op_arry.sh
与Java,PHP和Python等语言不同,sh的流控制不能为空,例如(以下是PHP流控制编写方法):
<?php
if (isset($_GET["q"])) {
search(q);
}
else {
// 不做任何事情
}
这在sh / bash中是不可能的. 如果else分支没有要执行的语句,请不要编写else

if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
示例:
#!/usr/bin/env bash
a=1
b=2
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
来源: op_if.sh
Shell的for循环类似于Python
for index in 1,2,3,4,5:
print(index); for index in 1 2 3 4 5; do
echo "index="$index
done for ((i=0; i<5; i++)); do
echo "i="$i
done
来源: op_for.sh
The
while循环用于连续执行一系列命令,并从输入文件中读取数据;这些命令通常是测试条件.
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
来源: op_while.sh
The
sh脚本与系统命令结合使用具有强大的功能. 在字符处理领域,有三位剑客: grep,awk和sed. grep负责查找特定行. Awk可以将行分成多个字段. Sed是可以执行写入操作,例如更新,插入和删除.
path=/var/log
log=${path}/httpd-mysql.log
name=(apache mysql)
exs_init[0]="service httpd start"
exs_init[1]="/etc/init.d/mysqld restart"
for ((i=0; i<2; i++)); do
echo "检查${name[i]}进程是否存在"
ps -ef|grep ${name[i]} |grep -v grep
if [ $? -eq 0 ]; then
pid=$(pgrep -f ${name[i]})
echo "`date +"%Y-%m-%d %H:%M:%S"` ${name[$i]} is running with pid $pid" >> ${log}
else
$(${exs_init[i]})
echo "`date +"%Y-%m-%d %H:%M:%S"` ${name[$i]} start success" >> ${log}
fi
done
说明: 检查nginx和mysql进程是否存在,如果不存在,它们将自动重启.
该脚本将在您每次运行时写入日志. 如果可以,您可以检查日志文件. 如果该过程不经常存在,恐怕要调查根本原因.
来源: check_nginx.sh
crontab -e
在文件末尾添加一行:
*/5 * * * * /xxx/check_nginx.sh > /dev/null 2>&1
上面的意思是每5分钟执行一次脚本/xxx/check_nginx.sh,其中xxx代表路径
/ dev / null 2>&1表示此shell命令不会将任何信息输出到控制台,也不会将任何信息输出到文件.
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-150557-1.html
铁汉柔情
美国明白的时候已经晚了