Shell
概述
常见命令
| 命令 | 功能 |
|---|---|
| cat /etc/shells | 查看已安装的Shell(Shell有多种版本,不同版本有相同的基本命令,和各自的特殊命令) |
| chsh -s /bin/sh | 更改默认使用的Shell |
| bash hello.sh | 显示调用bash版本的Shell执行文件 |
Shell文件
shell创建流程
- 脚本的第一行以 #! 开始(shebang 指令),用于指定运行该脚本的解析器。如果没有解析到shebang指令,sh将会默认使用 /bin/sh执行。
- chmod a+x hello.sh :给文件赋予权限
- ./hello.sh执行文件
bash
#!/bin/bash
echo "Hello Shell!"作为命令执行
| 命令 | 功能 |
|---|---|
| mv hello.sh /usr/local/bin <br>hello.sh | 将sh文件移动到bin目录下,然后直接输入文件名即可执行 |
| ln -s ./hello.sh /usr/local/bin/hello<br/>hello.sh | 通过创建软链接执行 |
| alias test="bash /opt/cmdtest/test.sh"<br/>test | 给命令创建一个别名 |
基础语法
变量
系统变量
shell
# Shell常见的变量之一系统变量,主要是用于对参数判断和命令返回值判断时使用,系统变量详解如下:
# 如$0使用即可
$0 当前脚本的名称;
$n 当前脚本的第n个参数,N>9 时用 ${N} 表示;
$* 当前脚本的所有参数(不包括程序本身);
$# 当前脚本的参数个数(不包括程序本身);
$? 令或程序执行完后的状态,返回0表示执行成功;
$$ 程序本身的PID号。环境变量
shell
# Shell常见的变量之二环境变量,主要是在程序运行时需要设置,环境变量详解如下:
# 如${PATH}使用即可
PATH 命令所示路径,以冒号为分割;
HOME 打印用户家目录;
SHELL 显示当前Shell类型;
USER 打印当前用户名;
ID 打印当前用户id信息;
PWD 显示当前所在路径;
TERM 打印当前终端类型;
HOSTNAME 显示当前主机名;
PS1 定义主机命令提示符的;
HISTSIZE 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间;
RANDOM 随机生成一个 0 至 32767 的整数;
HOSTNAME 主机名自定义变量
shell
# 注意 = 左右没有空格,给变量text赋值
text=世间好物不坚牢,彩云易散琉璃脆。
# 使用${}输出变量,如果仅输出text可以省略
echo "${text}_end"
# 将命令的结果输出给files
files=`ls` # 等同于files=$(ls)
# 此处可以省略括号
echo $files
#算数展开,展开为表达式计算后的值。
$(( expression ))
#大括号展开
#展开为 abc?g abd*g abefg,类似分配率
ab{c?, d*, ef}g declare(赋予变量特殊属性)
shell
# 设置只读变量,同 readonly 命令声明的变量
declare -r CONST_INT=2
# 数字类型变量
declare -i a_int=3
# 设置为环境变量
declare -x ENV_VAR=value 变量展开
${#variable}: 展开为变量的内容长度或数组的长度。${variable:-default}:为变量设置默认值,当变量内容为空时,展开为默认值。${variable:offset:length}: 从offset开始,读取length长度的字符串
输入输出
| 命令 | 使用 |
|---|---|
printf: 格式化输出,类似 C 的 printf 函数。 | printf "保留2位小数:Pi= %1.2f" $PI |
echo: 打印内容到标准输出。 | echo "hello world" |
read -p "请输入任意值" name | 读取输入,-p表示在读取输入之前显示提示信息 |
| read name1 name2 < file.txt | 从文件中读取数据到name1、name2中 |
流程控制
顺序执行
使用分号或者;作为一个命令的执行标志,某行命令执行失败,shell会继续往下执行,而不是跳过。
条件分支
&& 和 || 运算符
shell
# 如果 test-command 为真(状态码为 0)就执行 command1,否则,执行 command2。
test-command && command1 || command2if 命令
结构
shell
# If条件判断语句,通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断
# 单分支语句 ---比较大小
if [条件表达式];then
语句1
fi
# 双分支if 语句
if [表达式]
语句1
else
语句2
fi
# 多支条件语句 ---判断成绩
if [表达式]
语句1
elif [表达式]
语句2
elif [表达式]
语句2
fi
# 示例
read -p "请输入你的成绩" score
# 注意[]和参数之前要有空格
if [ $score -lt 60 ];then
echo "不及格"
elif [ $score -lt 80 ];then
echo "一般"
else
echo "优秀"
fi 参数
| 参数 | 作用 |
|---|---|
| -f | 判断文件是否存在 eg: if [ -f filename ]; |
| -d | 判断目录是否存在 eg: if [ -d dir ]; |
| -eq | 等于,应用于整型比较 equal; |
| -ne | 不等于,应用于整型比较 not equal; |
| -lt | 小于,应用于整型比较 letter; |
| -gt | 大于,应用于整型比较 greater; |
| -le | 小于或等于,应用于整型比较; |
| -ge | 大于或等于,应用于整型比较; |
| -a | 双方都成立(and) 逻辑表达式 –a 逻辑表达式; |
| -o | 单方成立(or) 逻辑表达式 –o 逻辑表达式; |
| -z | 空字符串; |
| -x | 是否具有可执行权限 |
| || | 单方成立; |
| && | 双方都成立表达式。 |
循环分支
for循环
遍历list数组中的元素
shell
for var in list
do
command1
command2
...
done
#示例
#!/bin/bash
for i in 1 2 3 4 5
do
echo "The value of i is: $i"
done
#执行结构与 C 语言 for 语句一样
for(( expr1; expr2; expr3 ));
do
commands
done
# 示例:输出1234
for(( option=1; option<1+4; option++ ));do echo -n $i; donewhile循环
while循环用于不断执行语句块,直到满足指定条件为止
shell
while condition
do
command1
command2
...
done
#示例
#!/bin/bash
j=0
while [ $j -lt 5 ]
do
echo "The value of j is: $j"
#使用算术运算符
j=$((j+1))
doneutil循环
和while循环不同的是,直到指定条件为假时才会停止循环
shell
until condition
do
command1
command2
...
done
#示例
#!/bin/bash
k=0
until [ $k -ge 5 ]
do
echo "The value of k is: $k"
k=$((k+1))
donebreak和continue
shell
while condition
do
command1
command2
if condition2
then
#跳过本轮循环
continue
fi
command3
...
done
while condition
do
command1
command2
if condition2
then
#跳出整个循环
break
fi
command3
...
done
#示例
#!/bin/bash
for l in 1 2 3 4 5
do
if [ $l -eq 3 ]
then
continue
fi
echo "The value of l is: $l"
if [ $l -eq 4 ]
then
break
fi
done函数
shell
# 创建函数
fname(){
commands
return
}
# 调用函数
fname
# 接受参数并使用
function greet() {
# 创建临时变量,当函数结束,该变量就会被释放。
local var="var in foo"
# 在shell中是全局变量,shell结束变量还在。
var="var in bar"
echo "Hello, $1 $2"
}
greet "John" "Doe"脚本编写
数据库备份
1、编写shell脚本
2、授予执行权限:chmod +x backup_db.sh
3、crontab -e:编写定时任务,20 12 * * * /path/to/backup_db.sh(表示每天12:20会执行一次脚本。)
shell
#!/bin/bash
# 设置备份目录
backupDir="/home/backup"
# 设置需要备份的数据库名称和用户名、密码
dbUser="root"
dbPass="123456"
dbName="database_name"
# 设置备份文件名,包括日期和时间
backupFile="$backupDir/${dbName}_$(date +%Y%m%d_%H%M%S).sql"
# 执行备份命令
mysqldump -u$dbUser -p$dbPass $dbName > $backupFile
# 压缩备份文件
gzip -f $backupFile
# 删除7天前的备份文件
find $backupDir -mtime +7 -type f -name "${dbName}*.sql.gz" -delete