你是否厌倦了在终端里重复输入相同的命令?是否希望让计算机自动完成繁琐的任务?Shell脚本就是你的终极解决方案!无论是批量重命名文件、定时备份数据,还是监控服务器状态,Shell脚本都能帮你一键自动化,大幅提升效率。本文将带你从基础语法到实战案例,彻底掌握Shell脚本编程,让你的Linux操作飞起来!
一、什么是Shell脚本
Shell脚本是一个包含一系列Linux命令的文本文件,扩展名通常为.sh,可以直接在终端运行。
举例如下:
#!/bin/bash
echo "Hello World!" # 打印Hello World
以上代码保存为hello.sh,运行:
chmod +x hello.sh # 添加执行权限
./hello.sh #
二、Shell语法
本人学习shell的原因是,公司需要配置jenkins打包环境,用到linux的shell脚本,了解一下其基本的语法。
2.1 打印 echo
#!/bin/bash
echo "Hello World !"
2.2 字符串
- 定义字符串
- 只读变量readonly
- 删除字符串变量
- 使用字符串变量
- 字符串拼接
- 字符串长度
- 提取子字符串
- 查找子字符串
2.2.1 定义字符串
your_name="runoob.com"
2.2.2 只读变量
#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl
# myUrl 为只读变量 这里赋值是错误的
myUrl="http://www.runoob.com"
2.2.3 删除字符串变量
unset variable_name
2.2.4 使用字符串变量
your_name="qinjx"
echo $your_name
echo ${your_name}
# 养成使用 ${your_name} 括号的良好习惯
2.2.5 字符串拼接
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 输出结果
hello, runoob ! hello, runoob !
2.2.6 字符串长度
string="abcd"
echo ${#string}
#输出 4
2.2.7 提取子字符串
string="runoob is a great site"
echo ${string:1:4}
# 输出 unoo
2.2.8 查找子字符串
# 查找字符 i 或 o 的位置(哪个字母先出现就计算哪个)
string="runoob is a great site"
echo `expr index "$string" io`
# 输出 4
注意: 以上脚本中 ` 是反引号,而不是单引号 ’
2.3 数组
- 定义数组
- 读取数组
- 获取数组的长度
2.3.1 定义数组
# 定义数组
array_name=(value0 value1 value2 value3)
# 定义数组
array_name=(
value0
value1
value2
value3
)
# 定义数组
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
2.3.2 读取数组
# 读取数组
valuen=${array_name[0]}
# 读取数组的所有元素
echo ${array_name[@]}
2.3.3 获取数组的长度
# 取得数组单个元素的长度
lengthn=${#array_name[0]}
# 取得数组元素的个数
length=${#array_name[@]}
# 取得数组元素的个数
length=${#array_name[*]}
2.4 运算符
- 加减乘除
- 相等-eq 不相等-ne
- 大于-gt 小于-lt 大于等于-ge 小于等于-le
- 与或非
2.4.1 加减乘除
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
2.4.2 相等-eq 不相等-ne
a=10
b=20
# -eq 是否相等
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
# -ne 是否不相等
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
2.4.3 大于-gt 小于-lt 大于等于-ge 小于等于-le
a=10
b=20
# 大于
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"
fi
# 小于
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小于 b"
else
echo "$a -lt $b: a 不小于 b"
fi
# 大于等于-ge
if [ $a -ge $b ]
then
echo "$a -ge $b: a 大于或等于 b"
else
echo "$a -ge $b: a 小于 b"
fi
# 小于等于-le
if [ $a -le $b ]
then
echo "$a -le $b: a 小于或等于 b"
else
echo "$a -le $b: a 大于 b"
fi
2.4.4 与或非
a=10
b=20
# -a 与运算
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
# 或运算
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
# 非
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a == $b: a 等于 b"
fi
2.4.5 AND OR
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
2.5 流程控制
2.5.1 if else
### if else
if condition
then
command1
else
command2
fi
### if else-if else
if condition1
then
command1
elif condition2
then
command2
else
command3
fi
### 举例
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
2.5.2 for 循环
for loop in 1 2 3
do
echo "The value is: $loop"
done
#结果
The value is: 1
The value is: 2
The value is: 3
for str in 'This is a string'
do
echo $str
done
#结果
This is a string
2.6 sed命令在MAC与Linux 使用方式
2.7 Linux使用
#直接将file文件里的printa替换为printb
sed -i 's/printa/printb/' test.txt
2.8 Mac使用
#mac的使用方式sed -ixxx 's/被替换文本/替换文本/' test.txt
sed -i.bak 's/printa/printb/' test.txt
三、参考
https://www.runoob.com/linux/linux-shell.html