尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux命令大全(超详细版)

Linux命令大全(超详细版) 一 ~ 四章【点击此处查看】五、shell 编程5.1、shell 概述5.1.1 shell 是什么Shell是一个命令行解释器它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序用户可以用Shell来启动、挂起、停止甚至是编写一些程序。Shell还是一个功能相当强大的编程语言易编写易调试灵活性较强。Shell是解释执行的脚本语言在Shell中可以直接调用Linux系统命令。5.1.2 shell 的分类Bourne Shell从1979起Unix就开始使用Bourne ShellBourne Shell的主文件名为sh。C Shell C Shell主要在BSD版的Unix系统中使用其语法和C语言相类似而得名Shell的两种主要语法类型有Bourne和C这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zshC家族主要包括csh、tcshBash Bash与sh兼容现在使用的Linux 就是使用Bash作为用户的基本Shell。5.2、shell 脚本的执行方式5.2.1 echo 输出命令命令名称echoecho[选项][输出内容]选项-e 支持反斜线控制的字符转换控制字符作用\输出\\a输出警告音\b退格键向左删除键\c取消输出行末的换行符和“-n”选项一致\eESCAPE键\f换页符\n换行符\r回车键\t制表符Tab键\v直制表符\0nnn按照八进制ASCII码表输出字符0为数字零nnn为三位八进制数\xhh按照十六进制ASCII码表输出字符其中hh是两位十六进制数示例[rootzhangRabbitMQ zhang]# echo -e ab\bcac[rootzhangRabbitMQ zhang]# echo -e a\tb\tc\nd\te\tfa b c d e f5.2.2 编写脚本[rootzhangRabbitMQ zhang]# vi /tmp/hello.sh#/bin/bashechohelloword5.2.3 执行脚本[rootzhangRabbitMQ zhang]# chmod 755 /tmp/hello.sh[rootzhangRabbitMQ zhang]# /tmp/hello.shhelloword5.3、Bash的基本功能5.3.1 历史命令与命令补全历史命令history命令名称history[rootlocalhost ~]# history [选项] [历史命令保存文件]选项-c 清空历史命令-w 把缓存中的历史命令写入历史命令保存文件 ~/.bash_history历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改历史命令的调用使用上、下箭头调用以前的历史命令使用“!n”重复执行第n条历史命令使用“!!”重复执行上一条命令使用“!字串”重复执行最后一条以该字串开头的命令命令与文件补全在Bash中命令与文件补全是非常方便与常用的功能我们只要在输入命令或文件时按“Tab”键就会自动进行补全5.3.2 命名别名与常用快捷键命令别名[rootlocalhost ~]# alias 别名原命令#设定命令别名[rootlocalhost ~]# alias#查询命令别名命令的执行顺序第一顺位执行用绝对路径或相对路径执行的命令。第二顺位执行别名。第三顺位执行Bash的内部命令。第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。让别名永久生效需要把配置写入配置文件/root/.bashrc中Bash 常用快捷键5.3.3 输入输出重定向同时输出正确和错误5.3.4 多命令执行与管道符多命令顺序执行管道符|命令名称|# 语法将命令1的输出结果作为命令2的输入 命令1 | 命令2命令格式[rootlocalhost ~]# 命令1 | 命令2#命令1的正确输出作为命令2的操作对象例子[rootlocalhost ~]# ll -a /etc/ | more[rootlocalhost ~]# netstat -an | grep ESTABLISHED查找aries用户cat/etc/passwd|grep-n “baizhi” 查找aries组cat/etc/group|grep-n “baizhi” 查找sshd进程ps-aux|grep sshd5.3.5 通配符与其他特殊符号通配符其他特殊符号5.4、Bash 变量5.4.1 用户自定义变量什么是变量变量是计算机内存的单元其中存放的值可以改变。当Shell脚本需要保存一些信息时如一个文件名或是一个数字就把它存放在一个变量中。每个变量有一个名字所以很容易引用它。使用变量可以保存有用信息使系统获知用户相关设置变量也可以用于保存暂时信息。变量设置规则变量名称可以由字母、数字和下划线组成但是不能以数字开头。如果变量名是“2name”则是错误的。在Bash中变量的默认类型都是字符串型如果要进行数值运算则必修指定变量类型为数值型。变量用等号连接值等号左右两侧不能有空格。变量的值如果有空格需要使用单引号或双引号包括。在变量的值中可以使用“\”转义符。如果需要增加变量的值那么可以进行变量值的叠加。不过变量需要用双引号包含“变量名”或用 变量名”或用变量名”或用{变量名}包含。如果是把命令的结果作为变量值赋予变量则需要使用反引号或$()包含命令。环境变量名建议大写便于区分。变量分类用户自定义变量  环境变量这种变量中主要保存的是和系统操作环境相关的数据。位置参数变量这种变量主要是用来向脚本当中传递参数或数据的变量名不能自定义变量作用是固定的。预定义变量是Bash中已经定义好的变量变量名不能自定义变量作用也是固定的。本地变量变量定义[rootlocalhost ~]# nameshen chao变量叠加[rootlocalhost ~]# aa123[rootlocalhost ~]# aa$aa456[rootlocalhost ~]# aa${aa}789变量调用[rootlocalhost ~]# echo $name变量查看[rootlocalhost ~]# set查看当前系统全部变量变量删除[rootlocalhost ~]# unset name5.4.2 环境变量环境变量是什么用户自定义变量只在当前的Shell中生效而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件那么这个环境变量就会在所有的Shell中生效设置环境变量export变量名变量值 申明变量env查询变量unset变量名 删除变量系统常见环境变量PATH系统查找命令的路径[rootlocalhost ~]# echo $PATH /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin: /sbin:/bin:/usr/sbin:/usr/bin:/root/binPATH$PATH:/root/sh PATH变量叠加 PS1定义系统提示符的变量 \d显示日期格式为“星期 月 日” \h显示简写主机名。如默认主机名“localhost” \t显示24小时制时间格式为“HH:MM:SS” \T显示12小时制时间格式为“HH:MM:SS” \A显示24小时制时间格式为“HH:MM” \u显示当前用户名 \w显示当前所在目录的完整名称 \W显示当前所在目录的最后一个目录 \#执行的第几个命令\$提示符。如果是root用户会显示提示符为“#”如果是普通用户会显示提示符为“$”示例[rootlocalhost ~]# PS1[\u\t \w]\$ [root04:50:08 /usr/local/src]#PS1[\u\ \h \# \W]\$‘[root04:53 上午 localhost 31 src]#PS1[\u\h \W]\$ 5.4.3 位置参数变量位置参数变量示例#!/bin/bashnum1$1num2$2sum$(($num1$num2))#变量sum的和是num1加num2echo$sum#打印变量sum的值[rootzhangRabbitMQ zhang]# /tmp/sum.sh 1 235.4.4 预定义变量5.5、Bash运算符5.5.1 数值运算与运算符declare声明变量类型数值运算[rootlocalhost ~]# declare [/-][选项] 变量名选项- 给变量设定类型属性: 取消变量的类型属性-i: 将变量声明为整数型integer-x: 将变量声明为环境变量-p: 显示指定变量的被声明的类型 方法1[rootlocalhost ~]# aa11[rootlocalhost ~]# bb22 #给变量aa和bb赋值[rootlocalhost ~]# declare -i cc$aa$bb方法2expr或let数值运算工具[rootlocalhost ~]# aa11[rootlocalhost ~]# bb22#给变量aa和变量bb赋值[rootlocalhost ~]# dd$(expr $aa $bb)#dd的值是aa和bb的和。注意“”号左右两侧必须有空格方法3“$((运算式))”或“$[运算式]”(推荐)[rootlocalhost ~]# aa11[rootlocalhost ~]# bb22[rootlocalhost ~]# ff$(( $aa$bb ))[rootlocalhost ~]# gg$[ $aa$bb ]5.6、环境变量配置文件5.6.1 配置文件简介source命令source命令通常用于保留、更改当前shell中的环境变量。[rootlocalhost ~]# source 配置文件或[rootlocalhost ~]# . 配置文件环境变量配置文件简介环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量。/etc/profile/etc/profile.d/*.sh~/.bash_profile~/.bashrc/etc/bashrc5.6.2 环境变量配置文件作用配置文件列表如下/etc/profile/etc/profile.d/*.sh~/.bash_profile~/.bashrc/etc/bashrctips:/etc 目录下的对所有用户都生效~/.bash_profile 和 ~/.bashrc - 每个用户自己的配置文件只对用户生效。配置文件读取顺序上图从左到右如果有叠加。后面的命令会覆盖前面的命令。/etc/profile的作用USER变量LOGNAME变量MAIL变量PATH变量HOSTNAME变量HISTSIZE变量umask调用/etc/profile.d/*.sh文件~/.bash_profile的作用用了~/.bashrc文件。在PATH变量后面加入了“:$HOME/bin”这个目录5.6.3 其他配置文件和登录信息注销时生效的环境变量配置文件~/.bash_logout其他配置文件~/bash_historyShell登录信息本地终端欢迎信息 /etc/issue5.7、正则表达式5.7.1 正则表达式与通配符正则表达式用来在文件中匹配符合条件的字符串正则是包含匹配。grep、awk、sed等命令可以支持正则表达式。通配符用来匹配符合条件的文件名通配符是完全匹配。ls、find、cp这些命令不支持正则表达式所以只能使用shell自己的通配符来进行匹配了。基础正则表达式示例1*前一个字符匹配0次或多次 ● grepa*test_rule.txt#匹配所有内容包括空白行● grepaa*test_rule.txt#匹配至少包含有一个a的行● grepaaa*test_rule.txt#匹配最少包含两个连续a的字符串● grepaaaaa*test_rule.txt#则会匹配最少包含四个个连续a的字符串示例2.匹配除了换行符外任意一个字符 ● greps..dtest_rule.txt#“s..d”会匹配在s和d这两个字母之间一定有两个字符的单词● greps.*dtest_rule.txt#匹配在s和d字母之间有任意字符● grep.*test_rule.txt#匹配所有内容0或多个任意字符示例3^匹配行首$匹配行尾 ● grep^Mtest_rule.txt#匹配以大写“M”开头的行● grepn$test_rule.txt#匹配以小写“n”结尾的行● grep-n^$test_rule.txt#会匹配空白行示例4[]匹配中括号中指定的任意一个字符只匹配一个字符 ● greps[ao]idtest_rule.txt#匹配s和i字母中要不是a、要不是o● grep[0-9]test_rule.txt#匹配任意一个数字● grep^[a-z]test_rule.txt#匹配用小写字母开头的行示例5[^]匹配除中括号的字符以外的任意一个字符 ● grep^[â-z]test_rule.txt#匹配不用小写字母开头的行● grep^[â-zA-Z]test_rule.txt#匹配不用字母开头的行 “\” 转义符● grep\.$test_rule.txt#匹配使用“.”结尾的行示例6\{n\}表示其前面的字符恰好出现n次 ● grepa\{3\}test_rule.txt#匹配a字母连续出现三次的字符串● grep[0-9]\{3\}test_rule.txt#匹配包含连续的三个数字的字符串示例7\{n,\}表示其前面的字符出现不小于n次 ● grep^[0-9]\{3,\}[a-z]test_rule.txt#匹配最少用连续三个数字开头的行示例8\{n,m\}匹配其前面的字符至少出现n次最多出现m次 ​​​​​​​● grepsa\{1,3\}itest_rule.txt#匹配在字母s和字母i之间有最少一个a最多三个a5.8 字符串截取命令5.8.1 cut 字段提取命令[rootlocalhost ~]# cut [选项] 文件名选项-f列号 提取第几列-d分隔符 按照指定分隔符分割列1.创建演示文件student.txt[rootlocalhost ~]# vi student.txtID Name gender Mark1Liming M862Sc M903Gao M83示例[rootlocalhost ~]# cut -f 2 student.txt#提取第二列[rootlocalhost ~]# cut -f 2,3 student.txt#提取第二第三列[rootlocalhost ~]# cut -d : -f 1,3 /etc/passwd#以为分隔符提取第一第三列2.cut命令的局限[rootlocalhost ~]# df -h | cut -d -f 1,3#有空格时提取会出问题不能识别多个空格情况5.8.2 printf 命令[rootlocalhost ~]# printf ’输出类型输出格式’ 输出内容输出类型%ns 输出字符串。n是数字指代输出几个字符%ni 输出整数。n是数字指代输出几个数字%m.nf 输出浮点数。m和n是数字指代输出的整数位数和小数位数。如%8.2f代表2位是小数8位是整数。 其中输出格式选项有输出格式控制字符作用\a输出警告声音\b输出退格键也就是Backspace键\f清除屏幕\n换行\r回车也就是Enter键\t水平输出退格键也就是Tab键\v垂直输出退格键也就是Tab键5.8.3 awk 命令[rootlocalhost ~]# awk ‘条件1{动作1} 条件2{动作2}…’ 文件名条件Pattern 一般使用关系表达式作为条件 x 10 判断变量 x是否大于10 x10 大于等于 x10 小于等于 动作Action 格式化输出 流程控制语句 示例[rootzhangRabbitMQ zhang]# vi /tmp/student.txtid name java linux mysql 1 bilei 88 88 88 2 zhang 60 60 60[rootzhangRabbitMQ zhang]# awk {printf $2 \t $5 \n} /tmp/student.txtname mysql bilei 88 zhang 60BEGIN#awk BEGIN{printf This is a transcript \n } {printf $2 \t $6 \n} student.txEND# awk END{printf The End \n }{printf$2\t$6\n} student.txtFS内置变量#cat /etc/passwd | grep /bin/bash | awk BEGIN {FS:} {printf $1 \t $3 \n}关系运算符#cat student.txt | grep -v Name | awk $6 87 {printf $2 \n }5.8.4 sed 命令sed 是一种几乎包括在所有 UNIX 平台包括 Linux的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。[rootlocalhost ~]# sed [选项] ‘[动作]’ 文件名选项-n 一般sed命令会把所有数据都输出到屏幕 如果加入此选择则只会把经过 sed命令处 理的行输出到屏幕。-e 允许对输入数据应用多条sed命令编辑-i 用sed的修改结果直接修改读取数据的文件 而不是由屏幕输出 动作 a \ 追加在当前行后添加一行或多行。添加多行时除最后 一行 外每行末尾需要用“\”代 表数据未完结。 c \ 行替换用c后面的字符串替换原数据行替换多行时除最 后一行外每行末尾需“\”代 表数据未完结。 i \ 插入在当期行前插入一行或多行。插入多行时除最后 一行 外每行末尾需要“\”代 表数据未完结。 d 删除删除指定的行。 p 打印输出指定的行。 s 字串替换用一个字符串替换另外一个字符串。格式为“行范 围s/旧字串/新字串/g”和vim 中的替换格式类似。 示例[rootzhangRabbitMQ zhang]# vi /tmp/student.txtid name java linux mysql 1 bilei 88 88 88 2 zhang 60 60 60#查看文件的第二行[rootzhangRabbitMQ tmp]# sed 2p student.txtid name java linux mysql 1 bilei 88 88 88 1 bilei 88 88 88 2 zhang 60 60 60#只显示第二行[rootzhangRabbitMQ tmp]# sed -n 2p student.txt1 bilei 88 88 88#删除第二行到第四行的数据但不修改文件本身[rootzhangRabbitMQ tmp]# sed 2,3d student.txtid name java linux mysql5.9 字符处理命令5.9.1 排序命令 sort[rootlocalhost ~]# sort [选项] 文件名选项-f 忽略大小写-n 以数值型进行排序默认使用字符串型排序-r 反向排序-t 指定分隔符默认是分隔符是制表符-k n[,m] 按照指定的字段范围排序。从第n字段开始m字段结束默认到行尾 示例[rootlocalhost ~]# sort /etc/passwd#排序用户信息文件[rootlocalhost ~]# sort -r /etc/passwd#反向排序[rootlocalhost ~]# sort -t : -k 3,3 /etc/passwd#指定分隔符是“”用第三字段开头第三字段结尾排序就是只用第三字段排序[rootlocalhost ~]# sort -n -t : -k 3,3 /etc/passwd#指定分隔符是“”用第三字段开头第三字段结尾排序以数值型进行排序5.9.2 wc 统计命令[rootlocalhost ~]# wc [选项] 文件名选项-l 只统计行数-w 只统计单词数-m 只统计字符数
返回列表