shell
基本使用
-
终端查看系统支持的shell解析器
cat /etc/shells
-
终端查看当前默认使用解析器,echo用于打印文本或者变量值
echo $SHELL
-
脚本名字使用.sh后缀(也可以使用其他自定义后缀,一般都是.sh)
-
脚本开头指定解析器-#! 后面指向解析器路径(如果不指定,则使用默认解析器)
#!/bin/bash
-
运行shell脚本
sh 脚本名.sh
bash 脚本名.sh
变量
-
系统变量
set # 查看所有的系统预定义变量
# 使用echo打印变量的值,$ 符号用来获取变量值 echo $HOME
-
自定义变量
#语法=前后不能有空格,变量默认是字符串 name=value name="value"
-
撤销变量
unset name
-
静态变量,静态变量不能修改、不能unset
readonly name=value
-
全局变量
name=value export name
# 在系统其他位置可以调 echo $name
-
引号
- 双引号:会解析字符串具体的一个内容
- 单引号:单纯的字符串,不会进行解析
name=1 name2=2 echo "$name" # 会打印1 echo '$name2' # 不打印2,打印name2
-
特殊变量-外部传参
$n
,例如 ls -a ,-a就是外部传递的参数echo $0 # 0代表的是文件名字 echo $1 # 1 是传入的第一个参数 echo ${10} # 如果是两位数 需要使用{}
$#
传递参数的个数$# # 外部传递几个参数就是几
$*
:代表命令行输入的所有参数# 会输出所有参数的内容,把所有参数看成一个整体 # 相当于 "$1 $2 $3 ..." echo $*
$@
:代表命令行输入的所有参数# 会输出所有参数的内容,不过把每个参数区分对待 # 相当于"$1" "$2" "$3" # 要保留每个参数的独立性时,特别是参数中包含空格或引号时,应该使用$@ echo $@
$?
:最后一次执行命令的返回状态echo $? # 如果返回0,则上一条命令成功,非0,则上一个命令执行不正确
运算符
默认情况下所有变量值都是字符串进行运算可以使用(())或者[]
$[1+2]
$((3+3))
条件判断
基础语法
# 语法一
test v1 判断条件 v2
# 语法二
[v1 判断条件 v2]
等于
test 2 -eq 1
不等于
[ 1 -ne 2]
-lt # 小于
-le # 小于等于
-gt # 大于
-ge # 大于等于
文件权限判断
[-r 文件名] # 判断文件是否有读取权限
[-w 文件名] # 判断是否有写权限
[-x 文件名] # 判断是否有指向权限
文件类型判断
[-e 文件名] #判断文件是否存在
[-f 文件名] # 文件存在并且是一个常规的文件
[-d 文件名]# 文件存在并且是一个目录
与
&&
或
||
流程控制
if
# 语法一
if [ 条件判断];then
程序
fi
# 语法二
if [ 条件判断] # 可以不使用;then,换行输入then
then
程序
fi
# 多层结构
if [ 条件判断 ]
then
程序
elif [ 条件判断 ]
then
程序
else
程序
fi
case
case $变量名 in "值1")
如果值1条件判断成功则执行
;;
"值2")
如果值2条件判断成功则执行
;;
*)
如果前面没有满足条件 则默认执行
;;
esac
for循环
# 语法一
for (( i=0;i <= 100; i++));do
echo $i
done
# 语法2 遍历数组
for i in v1 v2 v3;do
echo $i
do
while循环
while [ 条件判断 ]
do
程序
done
read
read的作用是读取控制台输入,类似Python 的input
# 语法
read 选项 参数
选项: -p:指定读取值的时候的提示
-t:指定读取值时的等待时间,如果不加则已知等待
参数:
变量:指定读取值时候的变量名
# 提示文案请输入密码,超时时间7秒,输入的内容复制给变量 password
read -t 7 -p "请输入密码:" password
echo $password
函数
系统函数
basename
# 从文件路径中提取出文件名部分
base /Users/a7/test.txt # test.txt
base /Users/a7/test.txt .txt # test
dirname
# 用于从文件路径中提取出目录部分
base /Users/a7/test.txt # /Users/a7
自定义函数
语法
# 使用function关键字声明函数
# function关键字是可选性,可以不写 直接sum()
function sum()
{
s = $[$1+$2]
echo $1
}
shell工具
cut
从文本行里提取特定的部分,并且可以将这些提取出来的内容输出
# 语法
cut [选项参数] 文件名
选项参数:
-f 列号,提前第几列
-d 分隔符 按照指定分隔符分割列 默认是\t
-c 按字符进行切割,后面加数字表示取第几列
# 用空格分割,取第一列的内容
cut -d " " -f 1 test.txt
# 取第二列的字符
cut -c 2 test.txt
# 先找到name这行,再进行列过滤
cat test.txt | grep "name" | cut -d " " -f 1
awk
一个强大的文本分析工具,把文件逐行读取,以空格为默认分隔符将每行切片,切开的部分再进行分析处理
# 语法
awk [选项参数] '/pattcrn1/{action1} /pattcrn2/{action2}' 文件名
选项参数:
-F 指定输入文件的分隔符
-v 赋值一个用户定义变量
pattcrn:awk在数据中查找内容的匹配模式
action:在找到匹配内容时所执行的意谢啦命令
awk -F: '{print $1, $3}' /etc/passwd
# 提取/etc/passwd中用户名(第1字段)和UID(第3字段)
awk -F: '{print $1, $3}' /etc/passwd
# 输出:root 0, daemon 1, bin 2, ...
# 打印UID大于1000的用户
awk -F: '$3 > 1000 {print $1}' /etc/passwd
# 计算文件大小总和(第5列是文件大小,单位为字节)
ls -l | awk 'NR > 1 {sum += $5} END {print "Total:", sum/1024, "KB"}'
# 格式化打印学生成绩表(对齐输出)
awk -F, '{printf "%-10s %3d %3d %3d\n", $1, $2, $3, $4}' scores.csv
# 匹配包含"error"或"WARNING"的行,并打印第1和最后一个字段
awk '/error|WARNING/ {print $1, $NF}' app.log
# 匹配以数字开头的行,并打印第2个字段
awk '$1 ~ /^[0-9]/ {print $2}' data.txt
BEGIN:在处理文件前执行(常用于初始化变量、设置分隔符)
END:在处理完所有文件后执行(常用于输出汇总结果)
# 统计学生总分和平均分
awk -F, '
BEGIN {OFS="\t"; print "Name", "Total", "Avg"}
{total = $2 + $3 + $4; print $1, total, total/3}
END {print "---\nDone processing", NR, "students"}
' scores.csv
风月都好看,人间也浪漫.