shell参考
shell:弱类型编程语言,即变量在使用之前不需要事前声明,甚至不区分类型。
1.变量类型:
脚本在执行时会启动一个子shell进程,命令行中启动的脚本会继承当前shell环境变量,系统自动执行的脚本(非命令行启动)就需要自我定义需要各种环境变量。
环境变量:export VARNAME=VALUE,作用域为当前shell进程及其子进程,同样可以再变量声明完之后再用export导出变量如:export VARNAME,不用加$符号
本地变量:VARNAME=VLAUE,作用域为整个bash进程
局部变量:local VARNAME=VALUE,作用域为当前代码段
位置变量:
$1,$2,...${10},${11},引用脚本的第几个参数
$_ ,最后一个参数
特殊变量:
$?,上一个命令执行状态返回值。程序状态返回值,0正确执行;1-255:错误执行;1,2,127系统预留
$0,脚本的路径名,可以使用dirname $0获取脚本路径名,basename $0获取文件名。
$#,脚本的参数个数
$*,脚本的所有参数,”$*“代表"$1 $2 $3"
$@,脚本的所有参数,"$@"代表"$1" "$2" "$3"
位移变量:shift,所有参数的位置依次向左移动,并$#减1
变量子串:
${变量},就相当于$变量
${#变量},求变量内容的字符长度
${变量:m},从第m个字符截取变量内容直到结尾
${变量:m:n},在变量内容中从第m个字符开始截取共n个字符
${变量#m*n},在变量内容中的开头开始删除最短匹配m*n
${变量%m*n},在变量内容中的结尾开始删除最短匹配m*n
${变量##m*n},在变量内容中的开头开始删除最长匹配m*n
${变量%%m*n},在变量内容中的结尾开始删除最长匹配m*n
${变量/m/n},替换变量内容中的第一个m为n
${变量//m/n},替换变量内容中的所有m为n
扩展变量:
${变量:-word},如果变量值为空,则返回word,但不代替变量的值
${变量:=word},如果变量值为空,则返回word,并替代变量的值
${变量:?word},如果变量值为空,则word作为标准错误输出,否则输出变量的值
${变量:+word},如果变量值为空,则什么都不做,否则替代变量的值
数组:
静态数组:array=(1 2 3)
动态数组:array=($(ls))
为数组赋值:array[1]=333
打印数组所有元素:${array[@]} 或 ${array[*]}
打印数组长度:${#array[@]} 或 ${#array[*]}
打印单个元素:${array[i]}
循环遍历数组列表:
for n in ${array[*]}
do
echo $n
done
2.使用变量
引用变量:${VARNAME},在不影响调用变量名称时,括号可省略
撤销变量:unset VARNAME,不用加上$符号
查看变量:set,查看当前shell中的变量,不用加任何参数符号。想要查看当前shell中的环境变量可以使用printenv、env、export都可以
追加变量:VARNAME=${VARNAME}AAA,可以在原有变量中追加变量进来,可以加在原有变量前也可以在后面。在不影响变量名称时可以不加大括号{}
3.条件判断
条件测试表达式: [ 表达式 ]、[[ 表达式 ]],有空格
逻辑运算,在[[ ]]中使用
逻辑与:&& ,当第一个条件为真时,后面条件继续执行;当第一个条件为假时,后面不执行
逻辑或:| | , 当第一个条件为假时,后面条件继续执行;当第一个条件为真时,后面不执行
组合条件,在[ ]中使用
-a:与 $$
-o:或||
!:非
if [ $# -eq 1 -a $1 -eq 2 ]
整数比较
-eq:测试两个整数是否相等。如 $a -eq $b
-ne:测试两个整数是否不等。
-gt:测试一个数是否大于另外一个数,可以使用>,但在[ ]中需要加上\
-lt:测试一个数是否小于一个数,可以使用<,但在[ ]中需要加上\
-ge:大于等于
-le:小于等于
文件测试,有时变量要加""
-e FILE:测试文件是否存在
-f FILE:测试文件是否问普通文件
-d FILE:测试指定路径是否为目录
-r FILE:测试当前用户对指定文件是否有读取权限
-w FILE:测试当前用户对指定文件是否有写权限
-x FILE:测试当前用户对指定文件是否有执行权限
-s FILE:文件存在且大小不为0
-L FILE:文件存在,且为链接文件
f1 -nt f2:文件f1比f2新为真
f1 -ot f2:文件f1比f2旧为真
字符串比较
"STRING1" == "STRING2":测试是否相等,相等为真,不等为假,可以使用=代替,注意等号两端的空格
"STRING1" != "STRING2":测试是否不等,不等为真,相等为假,注意两端的空格
><:大于或小于
-z 字符串:测试指定字符串是否为空,空为真,不空为假,(变量加"")也可以[ $a == "" ]这样判断是否为空
-n 字符串:测试指定字符串是否不空,不空为真,空为假 (变量加"")
条件测试
test 测试表达式
[ 测试表达式 ]
[[ 测试表达式 ]]
(( 测试表达式 ))
多分支if语句
1 2 3 4 5 6 7 8 9 10 11 12 13 | if [ 判断条件 ];then statements1 …… elif [ 判断条件2 ];then statements2 …… elif [ 判断条件3 ];then statements3 …… else statements4 …… fi |
case语句
1 2 3 4 5 6 7 8 9 10 11 | case "变量" in 值1) 指令1 ;; 值2) 指令2 ;; *) 指令3 ;; esac |
for循环
1 2 3 | for 变量 in 列表; do 循环体 done |
while循环:适用于循环次数未知的情况,要有退出条件
1 2 3 | while [ 条件 ]; do 循环体 done |
seq循环
1 | `seq [起始数 [步进长度]] 结束数` seq 1 1 100 从1开始,每次增长1,至100结束。默认起始和步长都为1 |
用while循环读取文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 1. exec 方法 exec <FILE while read line do CMD done 2. cat 方法 cat FILE | while read line do CMD done 3. while 结尾处 while read line do CMD done <FILE |
select打印菜单列表
1 2 3 4 5 | PS3= "这里是要打印的循环提示符,跟select是一对" select 变量 in 列表 do CMD done |
循环控制
1 2 3 4 | break n:省略n表示退出当前循环,n表示退出循环的层数 continue n:省略n表示忽略后面剩余代码,直接进行下一次循环 exit n:退出当前shell程序,并返回值 return n:函数返回值 |
4.算术运算
a**b:幂运算
3**3=27
let整数算术运算表达式
let C=$A+$B
$[算术运算表达式]
C=$[$A+$B]
$((整数算术运算符)) 整数运算的常用运算符
C=$(($A+$B))
expr 整数算术表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
C=`expr $A + 2` echo $? 可以判断A是否为整数
let sum+=$i --> sum=sum+i
let i+=1 --> let i++ --> i=i+1 (+=,-+,*=,/=,%=)
bc:计算器,scale=2代表保留两位小数
echo `seq -s "+" 5`=`seq -s "+" 5 | bc`
1+2+3+4+5=15
5.读入
read -p “提示信息” -t 超时时间 变量名
6.正确错误符号
首先需要加载系统方法函数,action关键字
7.函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | function 函数名() { 指令 return n } 或<br> function 函数名 { 指令 return n } 或<br> 函数名() { 指令 return n } |
8.生成随机数的方法
1 2 3 4 5 | 通过RANDOM函数做加密后,用 cut 截取 echo $RANDOM | md5sum | cut -c 8-10 通过openssl openssl rand - base64 8 |
9.脚本调试
bash
-n:不会执行该脚本,仅查询脚本的语法问题,并给出错误提示
-v:先将脚本的内容打印出来
-x:调试模式
在脚本中内容中添加set -x开启调试功能,set +x关闭调试功能
1 2 3 4 5 | 脚本内容 set -x 脚本内容 set +x 脚本内容 |
10.屏蔽键盘信号
1 2 3 4 5 6 7 8 9 10 11 12 | 可以使用 trap -l查看都有哪些信号,常用信号为: HUP 1:挂起 INT 2:中断,相当于ctrl+c QUIT 3:退出,相当于ctrl+\ ABRT 6:终止 ALRM 14:报警 TERM 15:终止 TSTP 20:停止,相当于ctrl+z 屏蔽ctrl+c键: trap "[这里可以是命令,也可以是空]" 2 [3 4 5后面可以跟多个] 恢复ctrl+c键: trap ":" 2 |
批量生成随机字符串
1 2 3 4 5 6 7 8 9 10 11 | #!/bin/sh source /etc/init .d /functions FILEPATH= /test FILENAME= test [ -d $FILEPATH ] || mkdir -p $FILEPATH for i in ` seq 10` do NAME=$(openssl rand - base64 40 | sed s@[^a-z]@@g | cut -c 1-10) touch $FILEPATH/${NAME}_$FILENAME action "`echo $FILEPATH/${NAME}_$FILENAME is created`" /bin/true done |
重定向
1 2 3 4 5 6 7 8 9 10 | #标准输出重定向到/dev/null,错误输出到控制台 find / -name passwd > /dev/null #标准输出和错误输出都重定向到/dev/null find / -name passwd > /dev/null 2>&1 find / -name passwd &> /dev/null find / -name passwd >& /dev/null #错误输出重定向到/dev/null,标准输出到控制台 find / -name passwd 2> /dev/null |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能