特殊变量
读取输入参数 $0~9
0为获取文件名称
如果获取第十个参数需要使用${10}
${#} 读取所有输入参数个数
$*
$@
上述都是获取所有输入参数
不使用双引号:功能一致
使用双引号括起来,上面为获取的所有参数拼接为一个字符串,格式为“$1,$2...”
下面的获取一组参数列表对象 "$1" "$2" ...
$? 用于获取上一个shell命令的退出状态码,或者函数返回值
每个shell命令的执行都有一个返回值,这个返回值用于说明命令执行是否成功
一般来说,返回0代表命令执行成功。
$$ 查看当前shell环境进程编号
shell环境分类
交互式与非交互式shell
交互式shell
与用户进行交互互动,效果是用户输入一个命令,shell立即反馈
非交互式shell
无需用户参与
登录shell与非登录
需要用户名密码的shell环境为登录环境
不同的工作环境加载环境变量流程不一样
字符串三种格式区别
双引号包含变量
单引号原样输出
不被引号包围和双引号一致,但是不能包含空格
字符串拼接:推荐使用双引号拼接
字符串截取
数组:在shell中,使用括号来表示数组,数组元素之间用空格来分隔
两种方式:
array_name=(item1 item2 ...)
array_name=([下标]=item1 ...)
note:等号之间不能由空格
数组内容可以是字符串
语法
获取下标元素值:${arr[index]}
获取所有元素:${arr[*]} 或者为${arr[@]}
获取数组长度:${#arr[*]}或者${#arr[@]}
获取数组指定元素字符长度:${#arr[索引]}
unset arr[index]删除数组指定元素
unset arr 删除整个数组
内置命令
shell内置命令,就是由Bash Shell 自身提供的命令,而不是文件系统可执行脚本文件
可以使用type确定一个命令是否为内置命令
type 命令
通常来说:内置命令会比外部命令执行更快,执行外部命令时会触发磁盘I/O,还需要fork出一个单独的进程
常见内置命令
alisa设置命令别名
不带参数显示当前所有shell进程中的别名列表
alias 别名=”命令“ 设置别名
unalias 别名 删除别名
unalias -a 删除所有别名
以上为临时删除,如果向永久删除必须去配置文件中删除
echo 输出字符串
默认换行输出 echo 字符串
不换行输出 echo -n 字符串
默认不解析转义字符
解析转义字符 echo -e 字符串
read读取控制台输入
从标准输入中读取数据并赋值给变量,如果没有重定向,默认从终端中读取,进行重定向可以从文件中读取
语法 read [-options] [var1 var2 var...]
var表示用来存储数据的变量
如果没有提供变量名,那么读取的数据放到‘REPLY’中
选项:
-n num 读取num个字符,而不是整行字符
-p prompt 显示提示信息,提示内容为prompt
-s 静默模式,不会再屏幕上显示输入字符
-t seconds 设置超时时间,单位为秒,如果没有在指定时间输入完成,那么read将会返回非零的退出状态,表示读取失败
exit 用于退出当前shell环境
返回一个状态码
用$?获取
应用场景,当文件执行出错的时候,可以返回不同的状态值来代表不同的错误
declare 设置变量
设置变量属性
declare [+/-] [aArxif] [变量名称=设置值]
declare -A 关联数组变量名=([字符串]=值 [字符串]=值)
查看全部shell变量和函数
实现关联数组变量
shell计算命令
expr命令详解:表达式求值
1.expr length 字符串 输出字符串长度
2.expr substr 字符串 start end 截取字符串
3.expr index 被查找字符串 需要查找的字符
正则表达式匹配
expr match 字符串 正则表达式
(())命令详解
进行整数的数学运算,使用$获取表达式命令的结果,这和使用$获取变量值是一样的
语法$((表达式))
(())内部自动解析变量,不使用$
let命令详解
let只能用于赋值计算,但没有(())功能强大,let只能用于赋值计算,不能直接输出,不可以条件判断
let 赋值表达式
let c=a+b
$[] 表示整数运算
bc命令
bc [options] [参数]
由于Bash shell内置了整数运算,Linux bc可以进行浮点运算
而且还可以进行进制的转换
-l 选项使用标准数学库
-q 不显示欢迎信息
参数为包含执行计算任务的文件
在shell内部,也是可以借助管道使用bc计算器的
语法:echo "expression" | bc [options]
expression必须符合bc命令的格式
里面可以引用shell里面的命令
将bc计算结果赋值给shell变量
第一种方式使用 ` 命令 `
第二种方式 $() 兼容性较差
shell中非互动式的输入重定向
将计算表达式输出给bc去执行,特点类似于文件中的输入
将EOF多行表达式输入给bc执行,然后将执行结果赋值给var_name
方式1:
var_name=`bc [-options] << EOF
第一行表达式
第二行表达式
EOF
`
方式2:
var_name=$(bc [-options] << EOF
第一行表达式
第二行表达式
EOF
)
流程控制语句
if语法
一行 if 条件; then 命令; fi
多行写法
if 条件
then
命令
else
命令
fi
if elif else语法
if 条件
then
命令
elif
命令
else
命令
fi
Linux任何命令的执行都会有一个退出状态,当它退出的时候,都会返回一个比较小的整数值给调用他的程序
test
功能
对整数比较测试
对字符串
对文件测试
test 数字1 options 数字2
整数比较
字符串比较
文件测试
case
case 值 in
匹配模式1)
命令
;;
匹配模式2)
命令
;;
esac
while循环
while 条件
do
命令
continue; #表示结束本次循环
break; 表示结束当前循环
done
until语句
循环条件同while相反,循环为false才会一直循环
until 条件
do
命令
continue; #表示结束本次循环
break; 表示结束当前循环
done
for语句
for var in test1 test2 test3
do
命令
done
for var in {start..end}
do
命令
done
select语句
使用select进行菜单选择操作
select var in menu1 menu2 ...
do
命令
done
note:select式无限循环,输入空值,或者输入的值无效都不会结束循环,只有遇到break才会结束循环
shell函数
系统函数
函数是有若干shell命令组成的语句块
basename函数
用于获取文件名
basename [string / pathname] [suffix]
dirname
从指定文件绝对路径,去除文件名,返回剩下的目录
自定义函数
语法
[ function ] funname()
{
命令
[return 返回值]
}
调用函数:funname 传递参数1 传递参数2...
return 如果不加,将以最后一条命令运行结果作为返回值,(范围为0~255)
有参函数
shell程序与函数区别
shell程序在子shell中运行,会开启独立的进程运行
shell函数在当前shell的进程中运行
shell重定向
每个Linux系统在运行的时候都会打开三个文件
1.stdin 获取键盘输入数据,文件描述符 0
2.stdout 将正确数据输出到显示器上 1
3.stderr 将错误信息输入到显示器上 2
改变输入方向,数据从非键盘位置流入,这就是输入重定向
改变输出方向,数据从非显示器位置流出,这就是输出重定向
语法如下
shell好用的工具
cut
使用cut可以切割提取指定列,字符,字节的数据,可以将文本按列进行划分,cut命令逐行读入文本,然后按列划分
cut [options] filename
sed
流编辑器,非交互流式文本编辑器 vim是交互式文本编辑器
语法:sed [选项参数] [模式匹配/sed程序命令] [文件名]
$代表最后一行
案例:
删除奇数行
sed ‘1~2d’ sed.txt
删除1到3行
sed '1,3d' sed.txt
删除最后一行
sed '$d' sed.txt
删除匹配ww的行
sed ‘/ww/d’ sed.txt
查询匹配的内容
sed -n '/ww/p' sed,txt
替换ww为jj
sed ‘s/ww/jj/g’ sed,txt
这里的g表示全局替换
sed -e 第一个命令 -e 第二个命令 sed.txt
或者在命令中以分号隔开
sed缓存区数据交换
sed处理文件是逐行处理的
sed没读取一行,就存放进入模式空间,sed还有一个空间叫做暂存空间,开始时只有一个空行
使用sed命令可以实现这两个空间数据的交互
awk
强大的文本分析工具
语法 awk [options] 'pattern{action}' {filename}
打印文件第二行
awk -F ":" 'NR==2{printf("filename:%s\n","FILENAME")}' passwd
sort
排序
sort (options)参数
根据第二列内容进行排序
sort -t " " -k2n,2 -uk1,2 sort.txt