文章目录shell脚本执行方式常用符号及命令变量分支循环函数函数案例shell脚本执行方式shell脚本就是将linux命令放入文本文件中由解释器执行bash解释器执行shlauf.sh自己执行必须以#!/bin/bash 开头必须具有可执行权限# 修改权限chmodux lauf.sh# 执行./lauf.sh其本质还是使用文件开头的/bin/bash 解释器执行的。常用符号及命令命令行提示符以$结尾表示普通用户以#结尾表示root用户最高权限脚本中#表示注释同python查看当前shell版本 - $SHELL or $0root用户id 为0 - echo $UIDPS1 变量表示命令提示符内容如PS1“\e\u\h~\w”打印输出echo 输出并自动换行printf 输出且不换行# 输出字符串并换行后面的内容均当做字符串echohello world# 输出且不换行echo-nhello world# 输出带有转义的字符echo-e\t\n# 带有颜色的输出echo-e\e[1;42m hello world\e[0m# printf 同C语言中printf()printf%-20s\njack# %4.2f -表示左对齐 默认右对齐 宽度不够空格补# %d查看文件内容cat lauf.sh 查看内容head lauf.sh 查看开头tail -f lauf.sh 查看结尾vim lauf.sh 编辑文件touch lauf.sh 创建文件ls -l lauf.sh 查看文件详情替换文本tr , echo xxx | tr “a” “b” 将内容中的a替换为b短补充、长截取tr “a-z” “A-Z” 小写集合内替换为大写集合内对应的字符echo 12345 | tr “0-9” “9876543210” - 87654第二个集合不能为空串类似 tr “[:lower:]” “[:upper:]”tr -d \n 删除空格、\ntr -d -c “0-9” 删除集合以外的字符算术运算let resultab; let a;result$[ab]result$((ab))expr 声明表达式使用let继续运算echo “2*0.5” |bc 浮点数运算echo “scale2;5/6”|bc 保留两位小数echo “obase2;$num”|bc 转二进制echo “sqrt(100)”|bcecho “2^3”|bc文件描述符与已打开文件或者数据流相关的整数是访问文件的指针0 标准输入 1 标准输出 2标准错误输出 --系统预留echo “hello world” out.txt标准输出重定向echo “xxxx” out.txt 标准输出追加重定向ls 2error.txt 1log.txt 标准错误重定向与标准输出重定向ls log.txt 21 标准错误 重定向到标准输出ls 2/dev/null 丢弃标准错误tee重定向到文件并交给管道 echo xx | tee -a out.txt | cat - file.txtcmd file 文件内容重定向到命令cat EOFlog.txt 将脚本中当前位置到EOF位置之间的内容重定向到文件中自定义文件描述符exec 3file 读取exec 4file 写入exec 5file; echo xxxx 4 写入文件校验和md5sum file1 file2 … xxx.md5 生产对应文件的校验和md5sum -c xxx.md5 校验文件是否损坏案例找个当前目录下的所有的C文件生成校验和并追加到c.md5文件find . -type f -name *.c -print0 |xargs -0 md5sum c.md5排序sort 排序 常结合uniq一起使用sort -n file.txt 数字方式排序【默认第一列】sort -k 2 file.txt 指定列排序sort -r file.txt 逆序排序sort -d file.txt 字典序排序sort -u file.txt 排序后去重 -b 忽略前导空白符cat file.txt | sort -k 3 | uniq -c 去重并统计重复的行数uniq -d 找出重复的行 -s 2 跳过指定字符数-w 2 判断重复时比较的最多字符数 -z 以\0作为定界符find 递归查找文件linux系统中一切皆文件文件的类型f 普通文件、d目录、l 链接文件、c字符设备、b块设备、s套接字使用 find ./ -maxdepth 3 -type f -name “*.txt” -print-maxdepth 递归查找的最大深度-mindepth 最小深度-type 文件类型-name 匹配名称 ! -name条件否定-iname 忽略大小写匹配名称-path 匹配整个文件路径-regex 简单正则匹配整个路径 find ./ -type f -regex “.*seq.*” -print字母不开头-atime 最近一次访问时间天-mtime 文件内容最近一次修改时间天-ctime 文件元数据最近一次修改时间天-amin、-mmin、-cmin 分钟find . -type f -name “*.c” -atime 7 等于7天find . -type f -name “*.c” -atime 7 大于7天find . -type f -name “*.c” -atime -7 小于7天-size 20k、 大于20k、 小于 -20k 根据大小查找 M G c字节 b 块512bytes-perm 644 根据权限查找-print 打印输出-print0 以 \0 作为定界符-delete 删除查询结果-exec 执行操作只能一个命令多个命令放入sh脚本find . -maxdepth 2 -type f -user lauf -name “*.txt” -exec chmod ux {} \;删除多个目录find . -type d -name “*pycache*” -exec rm -rf {} \; 也通过xargs 转为命令行参数进行删除解析大括号{}替换为每个文件\; 必须是一个反斜杠分号-exec cat {} \; out.log-exec cp {} target_dir \;-exec ./lauf.sh {} \;-prune裁剪 跳过指定的目录 find . \(-name “dir -prune \) -o \(-type f -path .c” -print \)命令行参数使用xargs 将输入内容转为命令行参数(一行)传给一个命令echo -e “jack\n tom\n lucy” | xargs 默认的定界符为 空格-d 指定定界符[laufingcentos ~]$ echo “jack,tom,lucy” |xargs -d ,jack tom lucyecho -e “jack\n tom\n lucy” | xargs -n 2 ./lauf.sh 转为两个参数依次传给脚本xargs -I {} ./lauf.sh -p {} 替换传参find . -type f -name “*.py” -print0 | xargs -0 rm -f 删除每个文件find . -type f -name “*.py” -print0 | xargs -0 wc -l 统计每个文件行数5 ./lauf.sh修改文件权限chmod urwx gr or lauf.shu 当前用户g 文件所属用户组o 其他用户a 所有用户chmod ax lauf.sh 所有用户添加可执行权限chmod u-wx lauf.sh 当前用户去除写、可执行权限ls -la 列出所有的文件及信息-rw-rw-r–. 1 laufing laufing 3 Sep 13 06:36 c1.c-rw-rw-r–. 1 laufing laufing 3 Sep 13 06:36 c2.c-rw-rw-r–. 1 laufing laufing 82 Sep 13 06:44 c.md5drwxr-xr-x. 2 laufing laufing 72 Mar 25 03:32 Desktopdrwxr-xr-x. 2 laufing laufing 6 Mar 25 01:56 Documents三组权限u g o、软连接数、用户、用户组、大小bytes、时间、文件名用户组相关命令groups 查看当前用户的所有组id 查看当前用户的UID、组等信息id jack 查看指定用户的UID、组等信息cat /etc/group # 查看系统中的所有的组列表组名:密码占位符:GID:成员列表sudo groupadd -g 1005 g_name 添加一个组并指定 GID 【非必须】sudo groupdel groupname 删除组sudo groupmod -n new_name old_name # 修改组名sudo groupmod -g new_gid old_gid 修改组的GIDsudo usermod -aG gname username-a: append (追加), -G: Groups (附属组) 如果不加 -a用户原有的其他附属组会被清空sudo usermod -aG wheel username将用户加入 wheel 组CentOS/RHEL或 sudo 组Ubuntu/Debian操作免sudo变量普通变量声明变量直接赋值同python两边不能有空格‘’ 单引号表示纯字符“”双引号表示一个整体反引号表示操作命令末尾没有号变量的值均为字符串使用$变量 获取值${#变量} 获取字符串值的长度# 直接赋值namejack# 纯字符pyCodeimport os\nimport csv\n xxxx# -e 识别转义字符输出到文件中echo-e$pyCodecontent.txt# $符引用变量的值statename is jack, current dir$(pwd)# 必须带括号echo-e$statecontent.txt环境变量配置环境变量以使linux操作系统可以使用。当前用户下的环境变量# 编辑文件vim~/.bashrc# 配置环境变量exportPATH$PATH:/home/xxx/pyexportLD_LIBRARY_PATHXXXX# 保存后使用变量生效source~/.bashrc全局的环境变量# editvim/etc/profile# configexportPATH$PATH:/home/xxx/py# enablesource/etc/profile命令行变量shell 脚本命令行函数的参数# 执行shell脚本传参$shlaufing.sh param1 param2# 脚本中使用$1 $2 ....$9..${10}# 获取参数个数 $## 获取所有的参数 $* / $# $?上一条指令的执行结果 0表示成功# 定义函数 类jsfunctionfunc(){echo$1echo$2}# 执行函数func param1 param2分支test xxx表示测试条件成功返回true数值比较-eq 等于-gt 大于-lt 小于-ge 大于等于-le 小于等于字符串比较 or 相同! 不同-z 长度为0 返回true-n 长度非0 返回true文化目录的判断-e 文件或者目录是否存在-f 存在且为文件-d 存在且为目录-r 文件存在且可读-w 文件存在且可写-x 可执行# test判断语句 可避免多层括号iftest5-gt3;thenechotruefi# 结束# [] 表示 数值 测试语句必须有空格# [[ ]] 字符串 测试语句 必有空格if[[$1]];thenechono paramselif[[$1lauf]]||[[$1tom]];thenecholauf or tom paramselseechoother paramsfi# 简化判断 上个指令执行成功时才进入指定目录[$?-eq0]cdlauf || 连接多个测试条件! 条件内部取反循环# 循环 数值序列 闭区间foriin{1..5};doecho$idone# 遍历字符串IFS;# 设置内部字段分隔符foriinjack;lucy;lilidoecho$i# jack lucy lili 整体done# 变量目录下的文件curDirls$(pwd)# 数组foriin$curDir# 引用数组doecho$idone# 通配符 匹配结果foriin*.jpg *.png;# 1 2 3 数组doecho$idone函数shell定义函数特别简单类似js。functionfunc1(){echo$1# 打印第一个参数echo$## 总参数个数echo$# 所有参数数组 可循环遍历}func2(){echofunc2}# 函数调用并传参func1tom4函数案例递归实现每个目录下添加文件。创建lauf.sh脚本#!/bin/bashfunctionaddFile(){if[-d$1];thenechoadd file for$1touch$1/lauf.txt# recursivedealDir$(pwd)/$1fi}functiondealDir(){# need absolute pathcd$1curFilesls$1foriin$curFiles;doaddFile$idone}# sh lauf.sh /home/laufing/aadealDir$1下一篇linux shell操作- 02 常用命令及案例