shell脚本

打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,如果用 php 写 shell 脚本,扩展名就用 php 。
#!/bin/bash
echo “Hello World !”
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。

运行 Shell 脚本有两种方法:

1、作为可执行程序

将上面的代码保存为 test.sh,并 cd 到相应目录:
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
要用 ./test.sh 告诉系统就在当前目录找。

2、作为解释器参数

直接运行解释器,其参数就是 shell 脚本的文件名
/bin/sh test.sh
/bin/php test.php

Shell 变量

变量是用于存储数据值的名称。
your_name=”runoob”

使用变量

在变量名前面加美元符号
your_name=”qinjx”
echo $your_name
echo ${your_name}
加花括号是为了帮助解释器识别变量的边界

只读变量

readonly 命令

删除变量

unset 命令
不能删除只读变量。

变量类型

字符串变量

使用单引号 ‘ 或双引号 “ 来定义字符串

整数变量

使用 declare 或 typeset 命令来声明整数变量

数组变量

允许在一个变量中存储多个值
数组可以是整数索引数组或关联数组

环境变量

这些是由操作系统或用户设置的特殊变量,用于配置 Shell 的行为和影响其执行环境。

特殊变量

有一些特殊变量在 Shell 中具有特殊含义
例如 $0 表示脚本的名称,$1, $2, 等表示脚本的参数。
$#表示传递给脚本的参数数量,$? 表示上一个命令的退出状态等。

Shell 字符串

单引号

单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号

双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符

拼接字符串

获取字符串长度

提取子字符串

string=”runoob is a great site”
echo ${string:1:4} # 输出 unoo

查找子字符串

string=”runoob is a great site”

echo expr index "$string" io # 输出 4

Shell 传递参数

脚本内获取参数的格式为 $n,n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数。
$0 为执行的文件名(包含文件路径)

Shell 数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
数组元素的下标由 0 开始编号。

定义数组

用括号来表示数组,数组元素用”空格”符号分割开。
数组名=(值1 值2 … 值n)
还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

读取数组

${数组名[下标]}
使用 @ 符号可以获取数组中的所有元素:
echo ${array_name[@]}
在数组前加一个感叹号 ! 可以获取数组的所有键
获取数组的长度

取得数组元素的个数

length=${#array_name[@]}

或者

length=${#array_name[*]}

取得数组单个元素的长度

length=${#array_name[n]}

关联数组

declare 命令
declare -A array_name -A 选项就是用于声明一个关联数组。 访问关联数组元素可以使用指定的键: array_name["index"]

Shell 基本运算符

Shell echo命令

Shell printf 命令

printf format-string [arguments...]
format-string: 一个格式字符串,它包含普通文本和格式说明符。 arguments: 用于填充格式说明符的参数列表。 格式说明符由 % 字符开始,后跟一个或多个字符,用于指定输出的格式。

Shell test 命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

Shell 流程控制

`if

if 语句语法格式:
if condition
then
command1
fi
写成一行(适用于终端命令提示符):
if [ $(ps -ef | grep -c “ssh”) -gt 1 ]; then echo “true”; fi`

`if else

if else 语法格式:
if condition
then
command1
else
command
fi`

if else-if else

if else-if else 语法格式: if condition1 then command1 elif condition2 then command2 else commandN fi if else 的 [...] 判断语句中大于使用 -gt,小于使用 -lt。 if [ "$a" -gt "$b" ]; then ... fi 如果使用 ((...)) 作为判断语句,大于和小于可以直接使用 > 和 <。 if (( a > b )); then ... fi

for 循环

for循环一般格式为: for var in item1 item2 ... itemN do command1 command2 ... commandN done 写成一行: for var in item1 item2 ... itemN; do command1; command2… done;