Shell变量
取出变量值
单引号:所见即所得
双引号:输出引号里面的所有内容,识别特殊字符,弱引用
无引号:连续的符号可以不加引号,有空格有歧义,最好使用双引号
反引号:
ls
引用命令执行的结果,就等于$()用法特殊变量
$ : 获取shell脚本的文件名,以及脚本路径
$n : 获取shell脚本的第n个参数,n在1-9之间,就可以写$1这样的,如果大于了10,就需要用$(10),参数之间用空格隔开
$# : 获取执行shell脚本后面的参数总个数
$* : 获取shell脚本所有参数,不加引号等同于$@的作用,加上了引号就是把接受的参数作为单个字符串了 “$1 $2”
$@ : 不加引号,效果同上,加上了引号, 效果是分开每个参数,”$1”, “$2”, 空格保留
特殊状态变量
- $? : 上一次命令执行是不是正常执行的,0正确,非0就是失败了
- $$ : 当前shell脚本的进程号
- $! : 上一次后台进程的PID
- $_ : 上次命令的最后一个参数
内置命令
1 | eval ls; cd xxx |
exec: 不创建子shell,执行该命令,完成命令之后自己就exit了
1 | exec date |
1 | read -p "Input :" var |
逻辑控制
if
语法: 如果一行里面写了多个语句,就要写分号;了,如果是一行就写了一句话了,就不用写分号了
1 | if command |
- bash的if语句会直接运行if后面的命令,如果该命令执行正确(状态码位0),处于then的命令就会被执行,否则就不会被执行,或者执行其他的逻辑语句,最后到fi结束逻辑控制
1 | if [ pwd ] |
if-then-else
1 | !/usr/bin/bash |
嵌套if
1 | if [ $1 -ge 2 ] |
elif语句
1 | if [ $1 -le 20 ] |
test
test命令最短的定义可能是评估一个表达式;如果条件为真,则返回一个0。如果表达式不为真,则返回一个大于0的数值,也可以将其称为假值。检查最后所执行命令的状态的最简便的方法就是$?
检测文件类型的option: test [option] filename,
-e : 该filename是不是存在
-f : 该filename是不是文件
-d : 该filename是不是目录
-b : 该filename是不是要给block device
-c : 该filename是不是一个character device
-s : 该filename是不是一个socket
-p : 该filename是不是一个FIFO(pipe)文件
-L : 该filename是不是要给连结档
文件权限的option : test [option] filename
- -r 检测文件是不是有可读属性
- -w 检测文件是不是有可写属性
- -x 检测文件是不是有可执行属性
- -u 检测文件是不是有SUID属性
- -g 检测文件是不是有SGID属性
- -k 检测文件是不是有Sticky bit属性
- -s 检测文件是不是非空白文件
两个文件之变的比较 : test filename1 [option] filename2
- -nt (newer than)判断filename1是不是比filename2新
- -ot (older than)判断filename1是不是比filename2旧
- -ef 判断filename1与filename2是不是一个文件,可以用在判断hard link上面,是不是指向了同一个文件
判断两个整数 : test num1 [option] num2
- -eq : equal 判断两个数值相等的吗
- -ne : not equal 判断两个数值不相等的吗
- -gt : greater than 判断n1 大于 n2吗
- -lt : less than 判断n1 小于 n2 吗
- -ge : greater than or equal 判断n1 大于等于 n2吗
- -le : less than or equal 判断n1 小于等于 n2吗
判断字符串
-z : 判断是不是空的,是用的就是true,不是空个,就是false
-n : 判断是不是不是空的,不是空个就是true,是空的就是false
= : string1 是不是等于string2
!= : string1 是不是不等于string2
&& 与 || (和c语言中的是一样的)
数学表达式: bash支持双小括号写入高级的数学表达式
1 | var=199 |
双中括号[[]]
- 双中括号提供了针对字符串的高级特性,模式匹配,正则表达式的匹配
- == : 就是c语言里面的,是不是相等意思
case
- 就是和c语言里面是一样的
1 | case "$1" in |
for命令
- 和c语言的一样,但是里面可能需要转义符号和双引号
1 | for i in {1..100};do |
- for遍历文件
1 | !/usr/bin/bash |
- c语言风格的for循环
1 | for (( a=1,b=2;a<=10;a++,b++ )) |
while循环
1 | while [ $1 -gt $2 ];do |
- 执行多个命令的时候,每条命令都是单独一行的
1 | !/usr/bin/bash |
until命令
- 和while的用法是一样的,就是意思是相反的
IFS分隔符
- 用来指定分隔符的,没有指定的话,好像是空格,可以指定的分割符有:空格,制表符,换行符,逗号
1 | oldifs=$IFS |
打断循环
- break
- break 2,就是跳出两层循环,其他的和c语言是一样的
- continue: 和c是一样的
循环输出的重新定向
- 在shell脚本里面,循环输出后的结果,可以进行重定向
1 | !/usr/bin/bash |
函数
函数的概念
- 当你需要一段重复的代码的时候,就可以把这段代码定义成函数了,可以重复的调用,下面是两种常用的定义函数的方式
1 | 标准的函数的定义,func_name后面可以不给括号,建议标准的写法吧 |
- 函数名需要唯一,负责会覆盖函数的定义的,就是和c语言一样的
- 在函数里面使用return命令来定制特殊的退出状态码,也可以保存到变量里面
- 函数里面的变量是属于局部变量的,写在脚本里面的变量是全局变量(除了函数体内部的)
- 可以在函数体里面生命上local,声明为局部的,虽然我认为没有什么用
1 | !/usr/bin/bash |
本文链接: https://talent-tudou.github.io/2024/10/19/Shell/Shell学习笔记/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!