shell编程

目录

shell脚本的第一行

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

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

复制代码
#!/bin/bash

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

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

变量

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

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

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

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

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

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

$*:代表所有参数内容

$$:表示当前进程的pid号

$#:表示参数个数

$@:代表所有参数(逐个获取)

使用双引号可以解析变量,使用单引号会原样输出

数据类型

shell中默认的数据类型是字符串

Linux下的计算器 -- bc

bc进行数值大小的判断结果:判断结果为真就返回1,结果为假就返回0

整数数值的运算

三种表示方法:

  • $(( 表达式 ))
  • $ 表达式
  • expr 表达式

    注意空格!

表示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

获得命令的输出结果

``或$()

字符串操作

复制代码
[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

相关推荐
动力 continue6 小时前
Linux 基础篇 · 压缩打包与用户管理
linux·服务器·基础命令linux
NJCloud7 小时前
Ansible(三)——Zabbix 监控系统部署与敏感信息加密
linux·运维·chrome·信息可视化·ansible·zabbix
ltl8 小时前
Cgroups v2:为什么内存限制设了,宿主机数据库还是被 OOM
linux
NJCloud8 小时前
TiDB 集群部署与 MySQL 兼容性适配实战
linux·运维·数据库·mysql·tidb
2401_868534788 小时前
UNIX常用命令英文全称与中文解释整理
linux·运维
阿祖zu9 小时前
开源项目-让本地 Codex 临时接管远程 Linux 服务,实现快速运维
linux·gpt·agent
Android系统攻城狮11 小时前
Linux PipeWire深度解析之pw_factory_create_object调用流程与实战(七十二)
linux·音频进阶·pipewire音频进阶
lsh曙光11 小时前
playbook剧本(2)--Ansible变量
linux·运维·网络
lengjingzju11 小时前
编译与调试完全指南—第14章 系统配置与调优
linux
大鹏的NLP博客12 小时前
通用 Linux 嵌入式板端 C/C++ ABI 与 Glibc 依赖治理规范
linux·c++·交叉编译