SHELL基础知识总结

代码规范

1、#!/bin/bash
//脚本第一行, #!魔法字符,指定脚本代码执行的程序。即它告诉系统这个脚本需要什么解释器来执行,也就是使用
哪一种Shell

2、#代表注释,#!特例 

3、//以下内容是对脚本的基本信息的描述,大家可以根据实际情况尽可能的写详细一些,方便后续使用者
# Name: 脚本名字
# Desc:描述describe
# Path:存放路径
# Usage:用法
# Update:更新时间
# Author:作者
# Release: 分发版本

//下面就是脚本的具体内容
commands
...

变量

定义:VAR1=1
使用变量:$VAR1
取消变量:unset VAR1
有类型变量: declare
-i 将变量看成整数
-r 使变量只读 readonly,该变量的值无法改变,并且不能为unset
-x 标记变量通过环境导出 export
-a 指定为索引数组(普通数组);查看普通数组
-A 指定为关联数组;查看关联数组
环境变量(export):定义在用户家目录下的.bashrc或.bash_profile文件中,用户私有变量,只能本用户使用。
全局变量(export):在/etc/profile /etc/bashrc下永久定义
内置变量
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
 若退出状态值为0,表示命令运行成功
 若退出状态值为127,表示command not found
 若退出状态值为126,表示找到了该命令但无法执行(权限不够)
 若退出状态值为1&2,表示没有那个文件或目录
$$:当前所在进程的进程号     echo $$  
$!:后台运行的最后一个进程号  (当前终端)
!$ 调用最后一条命令历史中的参数
!! 调用最后一条命令历史
$#:脚本后面接的参数的个数
$*:脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开
$@: 脚本后面所有参数,参数是独立的,也是全部输出

ECHO

OPTIONS:
-n	不要在最后自动换行
-e	转义必须加

转义字符
\a	发出警告声;
\b	删除前一个字符;
\t	插入tab;
\n	换行且光标移至行首;
\c	最后不加上换行符号;
\f	换行但光标仍旧停留在原来的位置;
\r	光标移至行首,但不换行;

echo -e "\033[字背景颜色;文字颜色m 字符串\033[0m"
echo -e “\033[31m 红色字 \033[0m”
  echo -e “\033[34m 黄色字 \033[0m”
  echo -e “\033[41;33m 红底黄字 \033[0m”
  echo -e “\033[41;37m 红底白字 \033[0m”
  
字颜色:30—–37
  echo -e “\033[30m 黑色字 \033[0m”
  echo -e “\033[31m 红色字 \033[0m”
  echo -e “\033[32m 绿色字 \033[0m”
  echo -e “\033[33m 黄色字 \033[0m”
  echo -e “\033[34m 蓝色字 \033[0m”
  echo -e “\033[35m 紫色字 \033[0m”
  echo -e “\033[36m 天蓝字 \033[0m”
  echo -e “\033[37m 白色字 \033[0m”

  
字背景颜色范围:40—–47
  echo -e “\033[40;37m 黑底白字 \033[0m”
  echo -e “\033[41;37m 红底白字 \033[0m”
  echo -e “\033[42;37m 绿底白字 \033[0m”
  echo -e “\033[43;37m 黄底白字 \033[0m”
  echo -e “\033[44;37m 蓝底白字 \033[0m”
  echo -e “\033[45;37m 紫底白字 \033[0m”
  echo -e “\033[46;37m 天蓝底白字 \033[0m”
  echo -e “\033[47;30m 白底黑字 \033[0m”
  
最后面控制选项说明
  \033[0m 关闭所有属性
  \033[1m 设置高亮度
  \033[4m 下划线
  \033[5m 闪烁
  \033[7m 反显
  \033[8m 消隐

  \033[30m — \33[37m 

设置前景色
  \033[40m — \33[47m 设置背景色
  
  
  \033[nA 光标上移n行
  \033[nB 光标下移n行
  \033[nC 光标右移n行
  \033[nD 光标左移n行
  \033[y;xH设置光标位置
  \033[2J 清屏
  \033[K 清除从光标到行尾的内容
  \33[s 保存光标位置
  \033[u 恢复光标位置
  \033[?25l 隐藏光标
  \033[?25h 显示光标

READ

-p  打印信息
-t  限定时间 
-s  不回显 
-n  输入字符个数 
read -s -t30 -p "Password: " pw   //交互输入密码

算术运算

整形运算

– expr

expr 5 \* 2 

  • – let
let a=100-3;echo $a

  • – $(())
echo $(( 100*3))

  • – bc
echo "scale=2;100/3"|bc

比较运算

 精确比较
        -eq         等于 equal

        -gt         大于

        -lt         小于

 模糊比较
        -ge         大于或等于

        -le         小于或等于

        -ne         不等于

逻辑运算符

  • ​ 逻辑与运算 &&
  • ​ 逻辑或运算 ||
  • ​ 逻辑非运算 !

数组

  • 一次附一个值
变量名=变量值
array[0]=v1
array[1]=v2
array[3]=v3
  • 一次附多个值
array=(var1 var2 var3 var4)
array1=(`cat /etc/passwd`)	//将文件中每一行赋值给array1数组
array2=(`ls /root`)
array3=(harry amy jack "Miss zhang")
array4=(1 2 3 4 "hello world" [10]=linux)

数组取值

${array[i]}  i表示元素的索引
使用@ 或 * 可以获取数组中的所有元素:
获取第一个元素
echo ${array[0]}
echo ${array[*]}			获取数组里的所有元素
echo ${#array[*]}			获取数组里所有元素个数
echo ${!array[@]}    	获取数组元素的索引索引
echo ${array[@]:1:2}    访问指定的元素;1代表从索引为1的元素开始获取;2代表获取后面几个元素

定义管理数组

首先声明关联数组
declare -A array1
declare -A array2
declare -A array3

关联数组

  • 一次赋一个值
数组名[索引]=变量值 array1[demo]=demo
  • 一次附多个值
array2=([name1]="harry" [name2]="jack" )
  • 查看关联数组
declare -A

if语句与shell运算

与文件存在与否的判断
-e	是否存在   不管是文件还是目录,只要存在,条件就成立
-f	是否为普通文件
-d	是否为目录
-S	socket
-p	pipe
-c	character
-b	block
-L	软link
文件权限相关的判断
-r	当前用户对其是否可读
-w	当前用户对其是否可写
-x	当前用户对其是否可执行
-u	是否有suid
-g	是否sgid
-k	是否有t位
两个文件的比较判断
file1 -nt  file2	比较file1是否比file2新	
file1 -ot  file2 	比较file1是否比file2旧
file1 -ef  file2	比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode
字符串之间的判断
-z  是否为空字符串   		字符串长度为0,就成立
-n  是否为非空字符串    	只要字符串非空,就是成立
string1 == string2 		是否相等
string1 != string2 		不等
多重条件判断
逻辑判断符号:
&&  	(and 逻辑与) 		两个条件同时满足,整个大条件为真
||	(or 逻辑或)		两个条件满足任意一个,整个大条件为真
! 	非运算

case语法

case $var in             定义变量;var代表是变量名
pattern 1)              模式1;用 | 分割多个模式,相当于or
    command1            需要执行的语句
    ;;                  两个分号代表命令结束
pattern 2)
    command2
    ;;
pattern 3)
    command3
    ;;
*)                    default,不满足以上模式,默认执行*)下面的语句
    command4
    ;;
esac				esac表示case语句结束

正则表达式

^	锚定开头 ^a 以a开头 默认锚定一个字符
$	锚定结尾 a$ 以a结尾 默认锚定一个字符
匹配符:匹配字符串
.	匹配除回车以外的任意一个字符	
( )	字符串分组	
[ ]	定义字符类,匹配括号中的一个字符	
[ ^ ]	表示否定括号中出现字符类中的字符,取反。	
\	转义字符
例子:
egrep "^a[a-z0-9]c$" file
egrep "^e\*f$" file 
egrep "^a.(b|c)$" file 
限定符:对前面的字符或者(字符串)出现的次数做限定说明
*	某个字符之后加星号表示该字符不出现或出现多次 a* (ab)*
?	与星号相似,但略有变化,表示该字符出现一次或不出现
+	与星号相似,表示其前面字符出现一次或多次,但必须出现一次
{n,m}	某个字符之后出现,表示该字符最少n次,最多m次
{m}	正好出现了m次
例子:
egrep "^ab*c$" file 
egrep "^ab+c$" file 
egrep "^ab{2,4}c$" file
egrep "^ab{3}c$" file 
egrep "^ab{1,}c$" file 
正则表达式POSIX字符
[:alnum:]	匹配任意字母字符0-9 a-z A-Z
[:alpha:]	匹配任意字母,大写或小写
[:digit:]	数字 0-9
[:graph:]	非空字符( 非空格控制字符)
[:lower:]	小写字符a-z
[:upper:]	大写字符A-Z
[:cntrl:]	控制字符
[:print:]	非空字符( 包括空格)
[:punct:]	标点符号
[:blank:]	空格和TAB字符
[:xdigit:]	16 进制数字
[:space:]	所有空白字符( 新行、空格、制表符)
grep '^((25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?).){3}(25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?)$' --color ip_base

SED

-e script 将脚本中指定的命令添加到处理输入时执行的命令中  多条件,一行中要有多个操作
-f script 将文件中指定的命令添加到处理输入时执行的命令中
-n        抑制自动输出
-i        编辑文件内容
-i.bak    修改时同时创建.bak备份文件。
-r        使用扩展的正则表达式
!         取反 (跟在模式条件后与shell有所区别)

#command   对文件干什么
sed常用内部命令
a   在匹配后面添加
i   在匹配前面添加
d   删除
s   查找替换  字符串
c   更改
y   转换   N D P 
p   打印
#flags
数字             表示新文本替换的模式
g:             表示用新文本替换现有文本的全部实例
p:             表示打印原始的内容
w filename:     将替换的结果写入文件
例子:
sed 'a\append data "haha"' data1
sed '2a\append data "haha"' data1    //在第二行后新开一行追加数据
sed '/3 the/a\append data "haha"' data1  //找到包含"3 the"的行,在其后新开一行追加内容
sed '2i\insert data "haha"' data1      //在第二行前新开一行插入数据
sed 's/dog/cat/' data1
sed 'c\change data "haha"' data1   //将data1文件中的所有行的内容更改
sed '3d' data1   //删除文件data1中的第三行数据
sed 'p' data1  //输出到屏幕
sed -e 's/brown/green/;s/dog/cat/' data1
sed  '3s/dog/cat/w text' data2
***从文件读取编辑器命令 -f 适用于日常重复执行的场景***
1)将命令写入文件
vim abc
s/brown/green/
s/dog/cat/
s/fox/elephant/

2)使用-f命令选项调用命令文件
sed -f abc data1 
1 the quick green elephant jumps over the lazy cat.
2 the quick green elephant jumps over the lazy cat.

AWK

BEGIN:处理数据源之前干什么 不需要数据源就可以执行
PROGRAM: 对数据源干什么 【默认必须有】 需要数据源
END:处理完数据源后干什么 需要program 需要数据源
awk '{print $6}' test    //提取第六列
awk -F ':' '{print $1,$3,$NF}' /etc/passwd
awk -f abc test
     //将程序写入文件,每次使用-f调用程序文件就好,方便,高效。
awk -v name='hapa' 'BEGIN{print name}'
awk 'NR==3{print $0}' test   //打印第三行全部
awk '$1=="3"{print $0}' test   //指定行的第一个字段精确匹配字符串为3
awk -F ':' '$1 ~ "^ro" {print $0}' /etc/passwd
awk -F ':' '$1 !~ "^ro" {print $0}' /etc/passwd
awk 环境变量
变量	          描述
FIELDWIDTHS	以空格分隔的数字列表,用空格定义每个数据字段的精确宽度
FS	输入字段分隔符号 数据源的字段分隔符 -F
OFS	输出字段分隔符号
RS	输入记录分隔符
ORS	输出记录分隔符号
awk 'BEGIN{FS=":";OFS="-"}NR==1{print $1,$3,$NF}' /etc/passwd
root-0-/bin/bash
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇