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.常用判断比较
- = 字符串比较
- -lt 小于(less than)-le 小于等于(less equal)
- -eq 等于(equal)
- -gt 大于 (greater than) -ge 大于等于 (greater equal)
- -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
read读取控制台输入
基本语法:
read(选项)(参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取时等待的时间(秒)
参数
变量:指定读取值的变量名
demo:提示5秒内,读取控制台输入的名称
#!/bin/bash
read -t 5 -p "Enter your name in 5 seconds" NAME
echo $NAME
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;
Shell工具
CUT
cut:工作就是剪,cut命令从文件的每一行剪切字节,字符和字段并将这些字符、字节和字段输出
1.基本用法
cut[选项参数] filename
说明:默认分隔符是制表符
2.选项参数说明
选项参数 | 功能 |
---|---|
-f | 列号,提取第几列 |
-d | 分隔符,按照指定分隔符分割列 |
demo:创建一个cut.txt内容如下
dong shen
guan zhen
wo wo
lai lai
le le
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
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"