Loading

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
posted @ 2025-05-19 11:22  木子七  阅读(17)  评论(0)    收藏  举报