笔记目录
前言
Shell ; Linux ; C语言中文网 ; 笔记
一、Shell变量
变量默认为_ 字符串类型 :
Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储
1.定义变量
注 : 赋值号 '=' 的周围不能有空格
variable=value // value 不能包含任何空白符
variable='value'
variable="value"
单引号 与 双引号 的区别
- 单引号' '包围_ r'原始字符串'
- 双引号" "包围_ 输出时会先解析里面的变量和命令,
建议 : 数字变量_ 不加引号 或 加单引号;没有特别要求的字符串等都加上双引号
2.使用变量
定义过的变量,只要在变量名前面加美元符号$即可
skill="Python"
echo $skill
echo ${skill} // 良好的编程习惯, { }可选,帮助解释器识别变量的边界
echo "I am good at ${skill}spider"
3.变量赋值
log=$(cat log.txt) // 用cat读取
log=`cat log.txt` // 反引号, 非单引号
echo $log
4.修改变量的值
已经定义的变量, 被可以重新赋值
5.删除变量
unset :
变量被删除后不能再次使用;unset 命令不能删除只读变量
unset variable_name
6.只读变量
readonly :
将变量定义为只读变量,只读变量的值不能被改变_ 改变将会报错
#!/bin/bash
myUrl="http://"
readonly myUrl
myUrl="https://" // 改变只读变量, 报错
7.变量的作用域
1.局部变量(local variable)
局部变量只能在函数内部使用
注 : Shell 函数中定义的变量默认也是全局变量,它和在函数外部定义变量拥有一样的效果
#!/bin/bash
#定义函数
function func(){
a=99
}
#调用函数
func
#输出函数内部的变量
echo $a
#!/bin/bash
#定义函数
function func(){
local a=99 // local_变量的作用域仅限于函数内部
}
#调用函数
func
#输出函数内部的变量
echo $a
2.全局变量(global variable)
变量在当前的整个 Shell 进程中都有效 // 同一shell中, 不同.sh脚本也有效
每个 Shell 进程都有自己的作用域,彼此之间互不影响
在 Shell 中定义的变量,默认就是全局变量
3.环境变量(environment variable)
全局变量只在当前 Shell 进程中有效,对其它 Shell 进程和子进程都无效。
如果使用export命令将全局变量导出,那么它就在所有的子进程中也有效了,这称为“环境变量”。
环境变量只能向下传递而不能向上传递,即“传子不传父”。
通过 export 导出的环境变量只对当前 Shell 进程以及所有的子进程有效,
如果最顶层的父进程被关闭了,那么环境变量也就随之消失了,
其它的进程也就无法使用了,所以说环境变量也是临时的。
环境变量在 Shell 子进程中有效,并没有说它在所有的 Shell 进程中都有效
如果我想让一个变量在所有 Shell 进程中都有效,不管它们之间是否存在父子关系 _ 将变量写入 Shell 配置文件
8.特殊变量
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名。 |
$n(n≥1) | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数 // 当被双引号" "包 |
含时,$@ 与 $* 稍有不同 | |
$? | 上个命令的退出状态,或函数的返回值 |
$$ | 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。 |
- 给脚本传递参数
#!/bin/bash
echo "Process ID: $$"
echo "File Name: $0"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "All parameters 1: $@"
echo "All parameters 2: $*"
echo "Total: $#"
- 给函数传递参数
#!/bin/bash
#定义函数
function func(){
echo "Language: $1"
echo "URL: $2"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "All parameters 1: $@"
echo "All parameters 2: $*"
echo "Total: $#"
}
#调用函数
func python https://
二、Shell字符串
1.字符串形式
1.单引号’ '包围
- 任何字符都会原样输出,在其中使用变量是无效的。
- 字符串中不能出现单引号,即使对单引号进行转义也不行。
2.双引号" "包围
- 如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。
- 字符串中可以出现双引号,只要它被转义了就行。
3.无引号
- 不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。
- 字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。
2.字符串长度
${#string_name}
#!/bin/bash
str="hello world"
echo ${#str}
3.字符串拼接
Shell 中你不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接
#!/bin/bash
name="Shell"
url="http"
str1=$name$url #中间不能有空格
str2="$name $url" #如果被双引号包围,那么中间可以有空格
str3=$name": "$url #中间可以出现别的字符串
str4="$name: $url" #这样写也可以
str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
4.字符串截取
Shell 截取字符串通常有两种方式:
从指定位置开始截取和从指定字符(子字符串)开始截取
格式 | 说明 |
---|---|
${string: start :length} | 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符 |
${string: start} | 从 string 字符串的左边第 start 个字符开始截取,直到最后 |
${string: 0-start :length} | 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符 |
${string: 0-start} | 从 string 字符串的右边第 start 个字符开始截取,直到最后 |
${string#*chars} | 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符 |
${string##*chars} | 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符 |
${string%*chars} | 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符 |
${string%%*chars} | 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符 |
1.从指定位置开始截取
这种方式需要两个参数:除了指定起始位置,还需要截取长度
- 从左边开始计数
${string: start :length}
包含start, 不填length, 默认为输出剩余全部
从左边开始计数时,起始数字是 0,输出大于1的子串时, 不会在第一个字符输出空格
···
输出大于1的子串时, 不会在第一个字符输出空格
···
- 从右边开始计数
${string: 0-start :length}
从右边开始计数时,起始数字是 1(这符合常人思维)。计数方向不同,起始数字也不同。
不管从哪边开始计数,截取方向都是从左到右。
2.从指定字符(子字符串)开始截取
这种截取方式无法指定字符串长度,只能从指定字符(子字符串)截取到字符串末尾。
Shell 可以截取指定字符(子字符串)右边的所有字符,也可以截取左边的所有字符。
- 使用 # 号截取右边字符
${string#*chars}
- 使用 % 截取左边字符
${string%chars*}
三、Shell数组
四、Shell数学计算
五、Linux 管道
六、Shell 内置命令
1.echo()
2.exit
七、Shell三剑客 -> Grep
1.grep 基本用法
筛选出所需关键字_ 所在的文本的行
# 可配合正则表达式, 找出所有相关的行
选项 :
-n 显示行号
-i 不区分大小写
-v 反向查找
# test.txt内容_ 本行删除
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the li
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
# 查找the并显示行号
grep -n 'the' test.txt
# 查找the并不区分大小写 :
grep -in 'the' test.txt
# 反向查找 -> 不包含 the 的行
grep -vn 'the' test.txt
2.中括号" [ ] "_ 查找集合字符
[ ] —— 里面无论有几个字符,都仅代表为一个字符, 相当于“或” 的关系
[^] ——括号里面的 ^ 是取反的意思
# 查找包含shirt 或 short 的行
grep -n 'sh[io]rt' test.txt
# [io],中括号写的是i和o,所以是i和o都可以,都符合条件
# 查找重复单个字符”oo“的行
grep -n 'oo' test.txt
# 'oo',这里两个o其实和上面的the是同理的
# 查找”oo“前不是”w“的行
grep -n '[^w]oo' test.txt
# 10,11行‘oo’前面不是‘w’,而是‘o’或多个‘o’,所以会显示出来
# 推论 : 查找第一对'oo'后, 判断前面是不是'w', 如果是的话, 再向后探索一位, 如果是'o'则输出
# 查找”oo“前不是小写字母的行
grep -n '[^a-z]oo' test.txt
# [^a-z],以a-z开头的小写字母
# 查找”oo“前不是大写字母的行
grep -n '[^A-Z]oo' test.txt
# [^A-Z],以A-Z开头的大写字母
# 查找包含数字的行
grep -n '[0-9]' test.txt
# 查找包含shirt 或 short 的行
3.查找行首 ^ 与行尾字符 $
查找行首 ^ 与行尾字符 $
# 查找以小数点“ . ” 结尾的行
grep -n '\.$' test.txt
# 小数点” . “ 在正则表达式中为元字符,需要使用转义字符” \ "将其转化为普通字符
# 查找空行
grep -n '^$' test.txt
# w..d就是中间的两个'.'表示任意字符
4.查找任意一个字符 ". “与重复字符” * "
# 查找以“w"开头,”d"结尾共4个字符的行
grep -n 'w..d' test.txt
# w..d就是中间的两个'.'表示任意字符
# 查询至少包含两个o以上的字符串
# 查找以‘w’开头,‘d’结尾 中间字符可有可无 的行
# 查询任意数字的行
grep -n '[0-9][0-9]*' test.txt
# [0-9][0-9]*第一个[0-9]必须有,第二个可以是0个也可以是多个
# 所以可以看成只要有数字不管多少字符的行都符合
5.查找连续字符范围 { }
八、Shell三剑客 -> Sed
1.sed的选项
-n:禁止自动打印模式空间内容,只有经过特定指令处理后的内容才会被打印。
-e <script>:指定脚本命令来处理输入文本。可以在同一行中使用多个-e选项来提供多个脚本命令。
-f <script-file>:从指定的文件中读取脚本命令。文件中可以包含多个命令。
-r:启用扩展的正则表达式语法,可以使用更简洁的正则表达式语法。
-i[<suffix>]:原地修改文件,即直接在文件中进行替换操作_可选的<suffix>参数用于指定备份文件的后缀
-s:安静模式,不打印模式空间内容。与-n选项类似,但可以在脚本中使用p命令来显示特定的行。
-u:启用非缓冲模式,用于处理大型文件时可以提高性能。
-z:将输入文件视为以空字符(null character)分隔的多行文本。可以用于处理以null字符分隔的记录。
-c:执行指定的脚本命令并退出,不进行后续处理。
-l:处理过程中处理行的长度被限制为2048字符。
-b:处理二进制文件。
2.直接在文件中进行替换操作_sed -Ei
格式 : sed -Ei "s/正则表达式/'替换的字符串'/g" "$文件路径"
#不加选项则需要加转义字符 : \([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}
-E选项_ 用于启用扩展的正则表达式语法
-i选项_ 用于原地修改文件
s/:表示进行替换操作。
/g:表示进行全局替换,即替换所有匹配到的正则表达式
3.
4.
5.
九、Shell三剑客 -> Awk
echo " pid : RES/VIRT = value";
top -n 1 -b |grep surfaceflinger |
awk '{printf "pid %s : %s/%s = %.4s\n",$1,$6,$5,$6/$5}'
字段分隔符:Awk默认将每一行文本分割成字段,字段之间的分隔符默认为空格或制表符。
在示例中,使用默认的字段分隔符将行分割为不同的字段。
内置变量:Awk提供了许多内置变量,如$1,$2等,用于表示第一个、第二个字段,以此类推。
在示例中,$1表示第一个字段,即进程ID。
些常见的Awk用法包括:
数据过滤:使用
滤特定的行或记录。
# 例如,awk '/pattern/ { action }' file可以根据模式匹配来处理文件中的特定行。
字段操作:Awk可以处理和操作文本字段。
# 您可以使用$n来引用字段,并使用内置函数对字段进行操作,如字符串拼接、数值计算等。
分组和聚合:Awk可以对数据进行分组和聚合操作,例如计算平均值、总和等统计信息。
多文件处理:Awk可以同时处理多个文件,您可以使用命令行参数或在Awk脚本中指定多个输入文件。
补充
1.正则表达式
() : 一个分组
(){3} : 前面分组匹配三次
\. : 紧跟一个点号
| : 或
[01]{}[]{}: 0或1开头,
[0-9] : 取值范围
{1,3} : 取1到3个数字
2[][] : 以2开头
1.粗略ipv4正则表达式
([0-9]{1,3}\.){3}[0-9]{1,3}
2.精准IPv4正则表达式
(([01]{0,1}[0-9]{0,2}|2[0-4][0-9]|25[0-5])\.){3}([01]{0,1}[0-9]{0,2}|2[0-4][0-9]|25[0-5])
2.Shell_ printf
printf format-string [arguments...]
总结
23/06/27 - 未完结