Skip to content

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 || command2
if 命令

结构

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; done
while循环

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))
done

util循环

和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))
done
break和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