shell脚本基础

发布时间 2023-04-01 15:35:13作者: 洋洋丫

shell脚本基础

1.第一个Shell脚本,输出hello world

​ 1.脚本以 #!/bin/bash开头(指定解析器)

#!/bin/bash

​ 2.写入命令

#!/bin/bash
echo "hello world"

​ 3.保存后执行

2.shell变量

系统变量:主要用于对参数判断和命令返回值判断时使用

$0		当前脚本名称;
$n		当前脚本的第n个参数,n=1,2,...9;
$*		当前脚本的所有参数(不包括程序本身);
$#		当前脚本的参数个数(不包括程序本身);
$?		命令或程序执行完之后的状态,返回0表示执行成功;
$$		程序本身的PID号;

环境变量:主要是在程序运行时需要设置

PATH			命令所示路径,以冒号分割;
HOME			打印用户目录;
SHELL			显示当前shell类型;
USER			打印当前用户名;
ID				打印当前用户id信息;
PWD				显示当前所在的路径;
TERM			打印当前终端类型;
HOSTNAME		显示当前主机名;
PS1				定义主机命令提示符的;
HISTSIZE		历史命令大小,可通过HISTTIMEFORMAT变量设置命令执行时间;
RANDOM			随机生成一个0到32767的整数;
HOSTNAME		主机名;

用户变量:局部变量,主要用于在Shell脚本内部或者临时局部使用

a=rivers					   自定义变量
Httpd_sort=httpd-2.4.6-97.tar	 自定义变量
BACK_DIR=/data/backup/			自定义变量
Ipaddress=10.0.0.1				自定义变量

3.常用判断比较

  1. = 字符串比较
  2. -lt 小于(less than)-le 小于等于(less equal)
  3. -eq 等于(equal)
  4. -gt 大于 (greater than) -ge 大于等于 (greater equal)
  5. -ne 不等于 (Not equal)

4.按照文件权限进行判断

​ 1.-r 有读的权限(read)

​ 2.-e 文件存在(existence)

​ 3.-d文件存在并是一个目录(directory)

5.多条件判断

​ && 表示上一条命令执行成功时,才执行下一条命令

​ || 表示上一条命令执行失败后,才执行下一条命令

6.流程控制

If判断

语法1:

if [ 条件判断式 ] ;then

程序

fi

语法2:

if [ 条件判断式 ] ;

then

​ 程序

fi

注意:

1)[ 条件判断式 ] ,中括号和条件判断式之间必须有空格

2)if 后要有空格

demo:输入一个数字,如果是1,则输出 I like drinking Coke,如果是2,则输出 I like to drink Sprite,如果是其他,则什么也不输出。

#!/bin/bash

if [ $1 -eq "1" ] ; then
        echo "I like drinking Coke "
elif [ $1 -eq "2" ]
then
        echo "I like to drink Sprite"
fi

Case语句

语法:

case $变量名 in

"值1")

如果变量的值等于值1,则执行程序1

;;

"值2")

如果变量的值等于值2,则执行程序2

;;

...省略其他分支...

*)

如果变量的值都不是以上的值,则执行此程序

;;

注意事项:

1.case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。

2.双分号“;;”表示命令序列结束,相当于java中的break。

3.最后的“*)” 表示默认模式,相当于java中的default。

demo:输入一个数字,如果是1,则输出I like drinking Coke,如果是2,则输出I like drink Sprite,如果是其他,则输出nothing

#!/bin/bash

case $1 in
1)
        echo "I like drinking Coke"
;;
2)
        echo "I like to drink Sprite"
;;
*)
        echo "nothing"
;;
esac

for循环

基本语法1:

for(( 初始值; 循环控制条件;变量变化))

do

程序

done

demo:从1加到100

#!/bin/bash

s=0
for((i=0;i<=100;i++))
do
        s=$[$s+$i]
done
echo $s

基本语法2:

for 变量 in 值1 值2 值3...

do

程序

done

dome:打印所有输入参数

#!/bin/bash

for i in $*
do
	echo "this is a char $i"
done

比较*和@的区别

1.*和@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$12...n的形式输出所有参数

#!/bin/bash

for i in $*
do
        echo "this is a char $i"
done

for j in $@
do
        echo "this is a char $j"
done

2.当他们被双引号“”包含时,“$”会将所有参数作为一个整体,以$12...n的形式输出所有参数;“$@”会将各个参数分开,以“$1” "2"..."n"的形式输出所有参数

#!/bin/bash

for i in "$*"
do
        echo "this is a char $i"
done

for j in "$@"
do
        echo "this is a char $j"
done

whule循环

基本语法:

while [ 条件判断式 ]

do

程序

done

demo:从1加到100

#!/bin/bash

for i in "$*"
do
        echo "this is a char $i"
done

for j in "$@"
do
        echo "this is a char $j"
done

image-20230329152616405

read读取控制台输入

基本语法:

read(选项)(参数)

选项:

-p:指定读取值时的提示符;

-t:指定读取时等待的时间(秒)

参数

变量:指定读取值的变量名

demo:提示5秒内,读取控制台输入的名称

#!/bin/bash

read -t 5 -p "Enter your name in 5 seconds" NAME
echo $NAME

image-20230329152520617

7.函数

系统函数

basename基本语法

自定义函数

1.基本语法

[ function ] funname[()]

{

​ Action;

​ [return int ;]

}

funname

2.经验技巧

1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其他语言一样先编译。

2)函数返回值,只能通过$?系统变量获得,可以显示加;return返回,如果不加,将以最后一条命令运行结果,作为返回值,return后跟数据n(0-255)

demo:计算两个输入参数的和

#!/bin/bash

function sum()
{
        s=0
        s=$[ $1 + $2 ]
        echo "$s"
}
read -p "Please input the number1:" n1;
read -p "Please input the number2:" n2;

sum $n1 $n2;

image-20230329152337476

Shell工具

CUT

cut:工作就是剪,cut命令从文件的每一行剪切字节,字符和字段并将这些字符、字节和字段输出

1.基本用法

cut[选项参数] filename

说明:默认分隔符是制表符

2.选项参数说明

选项参数 功能
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列

demo:创建一个cut.txt内容如下


dong shen
guan zhen
wo wo
lai lai
le le
image-20230329153906144

SED

sed:是一种流编辑器,它一次处理一行内容。处理时把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾,文件内容并没有改变,除非你使用重定向存储输出。

1.基本用法

sed [ 选项参数] ‘command’ filename

2.选项参数说明

选项参数 功能
-e 直接在指令列模式上进行sed的动作编辑

3.命令功能描述

命令 功能描述
a 新增,a的后面可以接字符串,在下一行出现
d 删除
s 查找并替换

demo:数据准备 sed.txt

dong shen
guan zhen
wo wom
lai lai

le le

image-20230329155403468

sed '2a hi hao' sed.txt

将hi hao 这个单词插入到sed.txt的第二行

cat sed.txt

文件不会有任何变化,只是输出有变化

sed '/wo/d' sed.txt

删除sed.txt文件所有包含wo的行

sed 's/wo/ni/g' sed.txt

将sed.txt文件中的wo替换成ni

sed -e '2d' -e 's/wo/ni/g' sed.txt

将sed.txt文件中的第二行删除并将wo替换成ni

AWK

awk:强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开部分再进行分析处理

1.基本用法

awk[选项参数] 'pattern1{action1}

pattern2{action2}...' filename

pattern:表示awk在数据中查找的内容,就是模糊匹配

action:在找到匹配内容时所执行的一系列命令

2.选项参数说明

选项参数 功能
-F 指定输入文件拆分隔符
-v 赋值一个用户定义变量

SORT

sort:将文件进行排序,并将排序结果标准输出

1基本语法

sort(选项)(参数)

2选项参数

选项 说明
-n 依照数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列

8.使用shell脚本创建一张数据表并且插入数据

#!/bin/bash# 定义MySQL连接信息
MYSQL_USER=root
MYSQL_PASSWORD=yourpassword
MYSQL_DATABASE=mydatabase 

#创建表mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE <<EOF
CREATE TABLE students (  
	id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(30) NOT NULL,  
    age INT(3) NOT NULL
 );
 EOF
 
 # 插入数据mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE <<EOF
 INSERT INTO students (name, age) VALUES ('Tom', 20);
 INSERT INTO students (name, age) VALUES ('Jerry', 21);
 INSERT INTO students (name, age) VALUES ('Bob', 22);
 EOF
 
 echo "Table 'students' created and data inserted successfully"