shell编程

目录

shell脚本的第一行

一般shell脚本的第一行用于在没有指定解释器时,默认使用这个解释器执行

如,默认使用Bash解释器来执行这个脚本

复制代码
#!/bin/bash

如果安装了python3,想写一个py文件并执行:

这里的第一行就写python3命令的所在目录,并给他加上可执行权限,这与指定了解释器执行是一样的

变量

shell变量使用需要在变量前面加一个$符号

位置变量: 1-9 分别代表参数列表中的第1-9个参数

预定义变量 : 系统预留的一些变量

$0:当前进程或者脚本名称

$!:后台运行的最后一个进程的pid号

$?:上一条命令程序返回值

$*:代表所有参数内容

:表示当前进程的pid号 $#:表示参数个数 $@:代表所有参数(逐个获取) ![在这里插入图片描述](https://file.jishuzhan.net/article/1703587374484688898/d24d6166b6724606ad3474aebc990a85.png) > 使用双引号可以解析变量,使用单引号会原样输出 ![在这里插入图片描述](https://file.jishuzhan.net/article/1703587374484688898/15d272b70ce24d03be67d74dc53b6160.png) # 数据类型 shell中默认的数据类型是字符串 # Linux下的计算器 -- bc ![在这里插入图片描述](https://file.jishuzhan.net/article/1703587374484688898/f29c91bd24bd48b0b3ac3093cacaf97d.png) bc进行数值大小的判断结果:判断结果为真就返回1,结果为假就返回0 # 整数数值的运算 三种表示方法: * $(( 表达式 )) * $\[ 表达式 \] * expr 表达式 ![在这里插入图片描述](https://file.jishuzhan.net/article/1703587374484688898/412df1e5b0b84400bd8f5b087abb4584.png) 注意空格! 表示1到9: * {1...9} * * for i in {1...9} * seq * * for i in \`seq9\` * * 输出0到10的偶数 `seq 0 2 10` * * 等宽位输出,高位用0补齐`seq -w 0 2 10` ![在这里插入图片描述](https://file.jishuzhan.net/article/1703587374484688898/35e568547afb4a94a473af0b070a0444.png) # 获得命令的输出结果 \`\`或$() ![在这里插入图片描述](https://file.jishuzhan.net/article/1703587374484688898/16f3632be81a49faa18233ac8d56bd5b.png) # 字符串操作 [root@localhost shell_script]# line=`head -n1 /etc/passwd` [root@localhost shell_script]# echo $line root:x:0:0:root:/root:/bin/bash 字符串长度 [root@localhost shell_script]# echo ${#line} 31 截取前4个字符 [root@localhost shell_script]# echo ${line:0:4} root 截取后9个字符 [root@localhost shell_script]# echo ${line:0-9} /bin/bash 从倒数第九个字符开始截取4个字符 [root@localhost shell_script]# echo ${line:0-9:4} /bin 从左向右截取最后一个:后的字符 [root@localhost shell_script]# echo ${line##*:} /bin/bash 从左向右截取第一个:后的字符 [root@localhost shell_script]# echo ${line#*:} x:0:0:root:/root:/bin/bash 从右向左截取最后一个:后的字符 [root@localhost shell_script]# echo ${line%%:*} root 从右向左截取第一个:后的字符 [root@localhost shell_script]# echo ${line%:*} root:x:0:0:root:/root # 数组 **定义:** 使用圆括号,之间以空格分隔 [root@localhost shell_script]# a=(1 2 3 4 5) 输出数组所有元素 [root@localhost shell_script]# echo ${a[@]} 1 2 3 4 5 按下标输出 [root@localhost shell_script]# echo ${a[1]} 2 数组长度 [root@localhost shell_script]# echo ${#a[*]} 5 截取 [root@localhost shell_script]# echo ${a[*]:1:2} 2 3 删除元素,但其他元素的下标不会变 [root@localhost shell_script]# unset a[2] [root@localhost shell_script]# echo ${a[@]} 1 2 4 5 [root@localhost shell_script]# echo ${a[2]} [root@localhost shell_script]# echo ${a[3]} 4 for循环中一次取出数组的元素:`for i in ${a[@]}` # 循环 ## for 第一种方式: for 变量 in 值1 值2 do 循环语句 done 第二种方式: for ((初始化变量;结束循环的条件;运算)) do 循环执行的语句 done ## while while 条件 do 执行循环语句 done 也支持break,continue # 判断 \[\]、\[\[\]\]、(())都可以用于判断 (())整数值的判断 \[\]判断字符串的过程中,如果有空白字符,他会进行分词 \[\[\]\]不会进行分词,建议使用\[\[\]\]进行判断 > \[ \]表示条件测试。注意这里的空格很重要。要注意在'\['后面和'\]'前面都必须要有空格。 语法: if [ command ];then 符合该条件执行的语句 elif [ command ];then 符合该条件执行的语句 else 符合该条件执行的语句 fi * 常用判断 \[ -d FILE \] 如果 FILE 存在且是一个目录则返回为真。 \[ -f FILE \] 如果 FILE 存在且是一个普通文件则返回为真。 * 字符串判断 \[ -z STRING \] 如果STRING的长度为零则返回为真,即空是真 \[ -n STRING \] 如果STRING的长度非零则返回为真,即非空是真 \[ STRING1 \]  如果字符串不为空则返回为真,与-n类似 \[ STRING1 == STRING2 \] 如果两个字符串相同则返回为真 \[ STRING1 != STRING2 \] 如果字符串不相同则返回为真 \[ STRING1 \< STRING2 \] 如果 "STRING1"字典排序在"STRING2"前面则返回为真。 \[ STRING1 \> STRING2 \] 如果 "STRING1"字典排序在"STRING2"后面则返回为真。 * 数值判断 \[ INT1 -eq INT2 \] INT1和INT2两数相等返回为真 ,= \[ INT1 -ne INT2 \] INT1和INT2两数不等返回为真 ,\<\> \[ INT1 -gt INT2 \] INT1大于INT2返回为真 ,\> \[ INT1 -ge INT2 \] INT1大于等于INT2返回为真,\>= \[ INT1 -lt INT2 \] INT1小于INT2返回为真 ,\< \[ INT1 -le INT2 \] INT1小于等于INT2返回为真,\< * 逻辑判断 \[ ! EXPR \] 逻辑非,如果 EXPR 是false则返回为真。 \[ EXPR1 -a EXPR2 \] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。 \[ EXPR1 -o EXPR2 \] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。 \[ \] \|\| \[ \] 用OR来合并两个条件 \[ \] \&\& \[ \] 用AND来合并两个条件 * 类似python的逻辑短路运算 cmd1 \&\& cmd2 如果cmd1执行成功,或者为真,则执行cmd2 cmd1 \|\| cmd2 如果cmd1执行不成功,或者为假,则执行cmd2 cmd1 \&\& cmd2 \|\| cmd3 如果cmd执行成功,就执行cmd2,不成功就执行cmd3 # case语句 case $变量名 in 条件1) 执行语句一 ;; 条件2) 执行语句二 ;; *) 执行语句三 esac # 函数 **定义:** 可以用function定义,也可以不使用 a() { } 或 function a() { } **调用:** 直接用函数名调用 `a` 如果要接参数: `a $1`

相关推荐
sanggou3 小时前
Linux批量执行工具脚本使用指南:一键运行多个release-dev.sh脚本
linux·bash
牧以南歌〆7 小时前
在Ubuntu主机中修改ARM Linux开发板的根文件系统
linux·arm开发·驱动开发·ubuntu
夜月yeyue9 小时前
设计模式分析
linux·c++·stm32·单片机·嵌入式硬件
kfepiza9 小时前
Debian的`/etc/network/interfaces`的`allow-hotplug`和`auto`对比讲解 笔记250704
linux·服务器·网络·笔记·debian
cuijiecheng201810 小时前
Ubuntu下布署mediasoup-demo
linux·运维·ubuntu
独行soc12 小时前
2025年渗透测试面试题总结-2025年HW(护网面试) 33(题目+回答)
linux·科技·安全·网络安全·面试·职场和发展·护网
java龙王*12 小时前
开放端口,开通数据库连接权限,无法连接远程数据库 解决方案
linux
bcbobo21cn13 小时前
Linux命令的命令历史
linux·histsize·histfile
jingyu飞鸟14 小时前
linux系统源代码安装apache、编译隐藏版本号
linux·运维·apache
世事如云有卷舒14 小时前
Ubunt20.04搭建GitLab服务器,并借助cpolar实现公网访问
linux·服务器·gitlab