收费网站推广,动漫制作就业方向,教育网站设计欣赏,网络营销推广方案创意一、什么是shell
shell的作用是#xff1a; 解释执行用户输入的命令程序等。 用户输入一条命令#xff0c;shell就解释一条。 键盘输入命令#xff0c;LInux给与响应的方式#xff0c;称之为交互式。 shell是一块包裹着系统核心的壳#xff0c;处于操作系统的最外层 解释执行用户输入的命令程序等。 用户输入一条命令shell就解释一条。 键盘输入命令LInux给与响应的方式称之为交互式。 shell是一块包裹着系统核心的壳处于操作系统的最外层与用户直接对话把用户的输入解释给操作系统然后处理操作系统的输出结果输出到屏幕给与用户看到结果。 从我们登录Linux, 输入账号密码到进入Linux交互式界面所有的操作都是交给shell解释并执行。 我们想要获取计算机的数据不可能每次都编写程序编译后再运行再得到我们想要的。例如你想找到一个文件可以先写一段C语言的代码然后调用系统函数通过gcc编译后运行程序才能找到文件。
因此有大牛开发shell解释器能够让我们方便的使用Linux,例如只要桥下ls -lh 这样的字符串shell解释器就会针对这句话翻译解释成ls -l -h 然后执行通过终端输出结果无论是图形化或是命令行界面。
即使我们用的图形化点的动作却也只是 命令行操作shell解释器执行后输出结果到黑屏命令行界面。 图形化操作shell接受点击操作输出图案数据。
二、什么是Shell脚本
shebang 美/ʃɪˈbæŋ/ : n.工作事情住所 当命令或者程序语句写在文件中我们执行文件读取其中的代码这个程序文件就称之为shell脚本。在shell脚本里定义多条linux命令以及循环控制语句然后将这些Linux命令一次性执行完毕执行脚本文件的方式称之为非交互式方式。 windows系统中shell脚本以.bat结尾的批处理脚本文件。 Linux系统中shell脚本以.sh结尾的脚本文件。 shell脚本规则
在Linux系统中shell脚本或者称之为(bash shell程序)通常都是vim编辑由Linux命令、bash shell指令、逻辑控制语句和注释信息组成。
三、Shebang
计算机程序中shebang指的是出现在文本文件的第一行前两个字符 #!。
在Unix系统中程序会分析shebang后面的内容作为解释器的指令例如 以#!/bin/sh开头的文件程序在执行的时候会调用 /bin/sh也就是bash解释器。 以#!/usr/bin/python 开头的文件代表指定python解释器去执行。 以#!/usr/bin/env 解释器名称是一种在不同平台上都能正确找到解释器的办法。
注意事项 如果脚本未指定shebang脚本执行的时候默认用户当前shell去解释脚本即$SHELL。 如果shebang指定了可执行的解释器如 /bin/bash /usr/bin/python ,脚本在执行时文件名会作为参数传递给解释器。 如果 #! 指定的解释器程序没有可执行权限则会报错“bad interpreter: Permission denied”。 如果#! 指定的解释程序不是一个可执行文件那么指定的解释程序会被忽略转而交给当前的SHELL去执行这个脚本。 如果 #! 指定的解释程序不存在那么会报错“bad interpreter: No such file or directory”。 在 #! 之后的解释程序需要写其绝对路径(如#!/bin/bash)它是不会自动$PATH中寻找解释器的。 如果你使用“bash test.sh”这样的命令来执行脚本那么 #! 这一行将会被忽略掉解释器当然是用命令行中显示或指定的bash。
脚本案例如下
[rootlocalhost opt]# cat test.sh
#! /bin/bash
ls .
echo 脚本执行完毕~ 四、脚本注释脚本开发规范 在shell脚本中#后面的内容代表注释掉的内容提供给开发者或使用者观看系统会忽略此行。 注释可以单独写一行也可以跟在命令后面。 尽量保持爱写注释的习惯便于以后回顾代码的含义尽量使用英文、而非中文
#! /bin/bash
# Date: 2024-05-20 16:52
# Author: created by chengjiagnbo
# blog: https://blog.csdn.net/u010132847?typeblog 五、执行shell脚本的方式 bash script.sh 或 sh scripte.sh 文件本身没权限执行没x权限则使用的方法或脚本未指定 shebang重点推荐的方式。 使用 绝对/相对 路径执行脚本, 需要文件含有x权限。 source script.sh 或者 . script.sh 代表 执行的含义, source等于点. 。 少见的用法, sh script.sh
[rootlocalhost opt]# ls
test.sh
[rootlocalhost opt]# sh test.sh
test.sh
脚本执行完毕~
[rootlocalhost opt]# bash test.sh
test.sh
脚本执行完毕~
[rootlocalhost opt]# source test.sh
test.sh
脚本执行完毕~
[rootlocalhost opt]# . test.sh
test.sh
脚本执行完毕~
六、shell和运维
shell脚本语言很适合处理纯文本类型数据且Linux的哲学思想就是一切皆文件如果日志、配置文件、文本、网页文件大多数都是纯文本类型的因此shell可以方便的进行文本处理好比强大的Linux三剑客(grep、sed、awk)。 6.1、脚本语言
shell脚本语言属于一种弱类型语言 无需声明变量类型直接定义使用数据类型默认都是字符串类型。
强类型语言必须先定义变量类型确定是数字、字符串等之后再赋予同类型的值。
Centos7系统中支持的shell情况有如下种类
[rootlocalhost opt]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
默认的sh解释器
[rootlocalhost opt]# ll /usr/bin/sh
lrwxrwxrwx. 1 root root 4 Jan 29 12:03 /usr/bin/sh - bash
6.2、其他脚本语言 PHP是网页程序语言专注于Web网页开发诸多开源产品wordpress、discuz开源产品doushiPHP开发。
Perl语言擅长支持强大的正则表达式以及运维工具的开发。
Python语言明星语言不仅适用于脚本程序开发也擅长Web页面开发如(系统后台资产管理平台),爬虫程序开发大量Linux运维工具也由Python开发甚至于游戏开发也是用。
6.3、shell的优势
虽然有诸多脚本变成语言但是对于Linux操作系统内部应用而言shell是最好的工具Linux底层命令都支持shell语句以及结合三剑客(grep、sed、awk)进行高级用法。 擅长系统管理脚本开发如软件启停脚本、监控报警脚本、日志分析脚本
每个语言都有自己擅长的地方扬长避短达到高效运维的目的是最合适的。
#Linux默认shell
[rootlocalhost ~]# echo $SHELL
/bin/bash
七、bash基础特性 7.1、bash是什么 bash是一个命令处理器运行在文本宽口中并能执行用户直接输入的命令。 bash还能从文件中读取linux命令称之为脚本。 bash支持通配符、管道、命令替换、条件判断等逻辑控制语句。
bash有诸多方便的功能有助于运维人员提升工作效率。
7.2、命令历史
shell会保留其会话中用户提交执行的命令
history #命令查看历史命令记录注意【包含文件中和内存中的历史记录】
[rootlocalhost ~]# echo $HISTSIZE #shell进程可保留的命令历史的条数
1000
[rootlocalhost ~]# echo $HISTFILE #存放历史命令的文件用户退出登录后持久化命令个数
/root/.bash_history
history命令
history #命令 以及参数
-c: 清空内存中命令历史。
-r: 从文件中恢复历史命令
数字显示最近n条命令 如history 10
7.3、特性汇总
文件路径tab健补全
命令补全
快捷键 ctrl a,e,u,k,l
通配符
命令历史
命令别名
命令行展开
八、变量含义
学生时代所学的数学方程式 如x1,y2, 那会称之为x, y是未知数。
对于计算机角度 x1, y2等于定义了两个变量名字分别是x, y且赋值了1和2。
变量是暂时存储数据的地方是一种数据标记(房间号标记了客人所在的位置)数据存储在内容空间通过调用正确的变量名字即可取出对应的值。 九、shell变量
9.1、变量定义与赋值注意变量与值之间不得有空格
[rootlocalhost ~]# name 波哥
-bash: name: command not found变量名
变量类型bash默认把所有变量都认为是字符串。bash变量是弱类型无需事先声明类型是将声明和赋值同时进行。
9.2、变量替换/引用
[rootlocalhost ~]# name波哥带你学bash
[rootlocalhost ~]# echo ${name}
波哥带你学bash
[rootlocalhost ~]# echo $name #可以省略花括号
波哥带你学bash9.3、变量名规则 名称定义要做到见名知意切按照规则来切不得引用保留关键字(help检查保留字) 只能包含数字、字母、下划线 不能以数字开头 不能用标点符号 变量名严格区分大小写
有效的变量名
NAME_BOGE
_boge
boge1
bogE1
Boge2_ge无效的变量名
?boge
bo*ge
boge
9.4、变量的作用域
作用域的理解(盒子的嵌套) 9.5、本地变量的识别 单引号变量不识别特殊语法。
双引号变量能识别特殊符号。 示例 备注echo: 美/ˈekoʊ/v.回响发出回声
9.6、不同的执行方式不同的shell环境
示例 解答 每次调用bash/sh解释器执行脚本都会开启一个子shell因此不保留当前的shell变量通过pstree命令检查进程树。 调用source或者点“.”符号在当前shell环境加载脚本因此保留变量。
备注如果centos系统执行pstree命令时碰到“-bash: pstree: command not found”, 则执行命令“yum -y install psmisc”安装。
9.7、一个面试题
问如下输出的内容是什么
[rootlocalhost ~]# cat test.sh
userwhoami
[rootlocalhost ~]# sh test.sh
[rootlocalhost ~]# echo $userA. 当前用户
B. 空[rootlocalhost ~]# source test.sh
[rootlocalhost ~]# echo $userA. 当前用户
B. 空
备注在linux中的反引号命令执行结果会被保留下来。
十、环境变量设置
环量变量一般指的是用export内置命令导出的变量用于定义shell的运行环境保证shell命令的正确执行。
shell通过环境变量确定登录的用户名、PATH路径、文件系统等各种应用。
环境变量可以在命令行中临时创建但是用户退出shell终端变量即丢失如果永久生效需要修改环境变量配置文件 用户个人配置文件 ~/.bash_profile、~/.bashrc 远程登录用户特有文件。 全局配置文件 etc/profile、/etc/bashrc。系统建议最好创建在/etc/profile.d/, 而非直接修改主文件修改全局配置文件影响所有登录系统的用户。
10.1、*检查系统环境变量的命令 set: 输出所有变量包括全局变量、局部变量。 env: 只显示全局变量。 declare: 输出所有的变量如同set。 export: 显示和设置环境变量值。
10.2、撤销环境变量 unset 变量名删除变量或函数。
10.3、设置只读变量 readonly, 只有shell结束只读变量失效。 10.4、系统保留环境变量关键字
bash内嵌了诸多环境变量用户定义bash的工作环境, 查看命令
[rootlocalhost ~]# export |awk -F [ :] {print $3} 10.5、bash多命令执行
多条命令时用英文分号分开如
[rootlocalhost home]# cd /;ls;cd /home;cd jiangbo;pwd 10.6、linux环境变量文件加载顺序 十一、特殊变量
11.1、shell的特殊变量用在如脚本函数传递参数使用
如下特殊的位置参数变量
$0获取shell脚本文件名以及脚本路径。
$n: 获取shell脚本的第n个参数n在1~9之间 如$1, $2...$9, 大于9则需要写 ${10}参数空格隔开。
$#: 获取执行的shell脚本后面的参数总个数。
$*: 获取shell脚本所有参数不加引号等同于$作用加上引号$*作用是 接收所有参数为单个字符串 “$1 $2...
$: 不加引号效果同上加引号是接收所有参数为独立字符串 如“$1” $2 $3 ..., 空格保留
示例
[rootlocalhost ~]# cat test.sh
#! /bin/bash
echo 特殊变量 $0 $1 $2 ..的实践
echo 结果 $0 $1 $2echo ######################
echo 特殊变量$# 获取参数总个数
echo 结果 $#echo ######################echo 特殊变量$ 实践
echo 结果 $
[rootlocalhost ~]# sh test.sh jiangbo 180 180 180
特殊变量 $0 $1 $2 ..的实践
结果 test.sh jiangbo 180
######################
特殊变量$# 获取参数总个数
结果 4
######################
特殊变量$ 实践
结果 jiangbo 180 180 180
11.2、$* 和 $的区别你了解吗
$*和$ 都表示传递给函数或脚本的所有参数。
当$*和$#不被双引号“ ”引起来时他们之间没有任何区别都是将接收到的每个参数看做一份数据彼此之间以空格来分隔。
但是当他们被双引号“ ”包含时就会有区别了
“$*”会将所有的参数从整体上看做一份数据而不是把每个参数都看做一份数据。
“$”仍然将每个参数都看做一份数据彼此之间是独立的。
示例
[rootlocalhost ~]# cat different.sh
#! /bin/bash
echo print echo param from \\$*\
for var in $*
doecho $var
doneecho ########################
echo print each param from \\$\
for var in $
doecho $var
done
[rootlocalhost ~]# sh different.sh jiangbo 180 180 180
print echo param from $*
jiangbo 180 180 180
########################
print each param from $
jiangbo
180
180
180
备注\\$*\中的反斜杠表示转义符号for表示循环do...done表示循环体。