1.第一个脚本:shell入门
1.1.shell脚本格式:
脚本以#!/bin/bash 或者 #!/bin/sh (指定解析器)
1.2.创建一个脚本文件
touch 文件名.sh
1.3.执行脚本文件
sh 文件名.sh [参数列表]
或者
bash 文件名.sh [参数列表]
1.4.输出“hello world”
#!/bin/bash
echo "hello world"
2.第二个脚本:多命令处理
#!/bin/bash
cd /home/
touch bangzhang.txt
echo "I love you" >> banzhang.txt
--切换至/home目录下创建banzhang.txt文件,并在文件中写入文本
echo:输出字符串到屏幕/提取shell变量的值
3.shell变量:
3.1.系统变量
$HOME:当前用户的家目录
$PWD:当前的目录
$SHELL:默认的解析器 --> /bin/bash
$USER:当前用户
3.2.自定义变量
自定义字母=值 ==>局部变量
注意:等号两边没有空格
3.3.利用echo 输出变量的值
echo $变量名
3.4.撤销变量:
unset 变量名
3.5.静态变量:只读
readonly 变量名=值
输出打印变量
echo $变量名
静态变量手动取消不了,在虚拟机重启后,自动取消
注意:在bash中,所有的变量类型都是字符串类型,无法直接进行数据运算
如果变量的值有空格,需要用双引号括起来 "i love you"
3.6.把变量升级为全局变量,可供其他shell程序使用
export 局部变量名
3.7.特殊变量:
$_ 是上个命令的最后一个参数
$? 返回的是:上一个命令的退出状态,或函数的返回值, 或最后一条命令的执行状态=>返回0:正确执行,返回非0:不正确执行
$! 最近一个后台命令的PID
$n 传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2....${10}....
$0 当前脚本的文件名
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。
被双引号 "值" 包含时,与$*稍有不同,
$@不会把 "值" 当作整体
$*会把 "值" 当作整体
$$ 表示当前Shell进程的ID,即pid
$- 列出Set命令设定的Flag
4.shell运算符
4.1 $((运算表达式)) 或 $[运算符表达式]
s=$[运算表达式]
echo $s
4.2 expr +,-,\*,/,% 加减乘除求余
expr 2 + 1 每个字符之间都需要有空格
expr `expr 2 + 3 ` \* 5 ==>等价于 (2+3)*5
5.条件判断
5.1 [ 具体的条件 ]==>中括号里面前后要有空格、
--条件非空即为true 条件为空即为false
(1)字符串之间的比较
=字符串比较
(2)数字之间的比较
-lt 小于 -le 小于等于
-eq 等于 -gt 大于
-ge 大于等于 -ne 不等于
(3)文件权限的判断
-r 读 -w 写 -x 执行
(4)判断文件类型
-f 是否是普通文件
-e 文件是否存在
-d 是否文件夹
(5)多条件判断
&&:并
||:或
6.流程控制
6.1 if判断语句
语法:
if[ 条件判断式 ];then
程序代码
fi
或
if [ 条件判断式 ]
then
程序
fi
注意:中括号里面前后一定要有空格
6.2 case语句
case $变量名 in
"值1")
如果满足值1:则执行此程序
;;
"值2")
如果满足值2:则执行此程序
;;
......
*)
都不满足以上的值,就执行此程序
;;
6.3 for循环
语法1:
for((初始值;循环条件;变量变化))
do
程序
done
-案例:1+...+100
#!/bin/bash
export s=0
for (( a=1 ; a<= 100 ; a++ ))
do
s=$[ s+a ]
done
echo $s
语法2:
for 变量 in 值1 值2 值3.... (in后面的值有依次把值赋给前面的变量)
do
程序
done
例:
#!/bin/bash
for a in $* ($*我们自己传入的参数)
do
echo $a
done
6.4 while 循环
while [ 条件表达式 ]
do
程序
done
-案例:1+...+100
#!/bin/bash
i=0
a=0
while [ $i -le 100 ]
do
a=$[ a+i ]
i=$[ i+1 ]
done
echo $a
注意:[]中一定要遵循shell语法,
-[]里面前后要有空格
-[]里面的运算表达式需要使用shell的运算符
7.读取控制台的输入
read 选项 参数
选项:-t指定几秒输入,
-p提示内容
相当于python中的input("请输入你的名字:")
#!/bin/bash
read -t 10 -p "input your name:" name (在10秒内输入你的名字)
echo $name
8.系统函数
8.1 basename 文件路径 [文件后缀名]
basename命令主要用于显示文件路径名剔除目录部分后的显示文件名。
如何指定了在最后指定了文件后缀,同时也删除文件的扩展名。
basename /home/datas/a.sh ===>输出:a.sh
basename /home/datas/a.sh .sh ===>输出:a
8.2 dirname 文件的绝对路径
去除文件名(非目录部分),返回文件夹路径
dirname+basename=文件的绝对路径
9.自定义函数
function 函数名(){
程序
}
#!/bin/bash
例:
#定义函数
function func(){
a=0;
a=$[ $1+$2 ]
return $a
}
read -p "输入你的第一个参数:" num1
read -p "输入你的第二个参数:" num2
#调用函数
func $num1 $num2
echo $?
函数返回值:return n(0-255)
echo $?
注意:
必须要在调用函数之前,声明函数。shell脚本是逐行运行的,不先进行编译的
10.shell工具
10.1 cut
从文件中剪切出自己需要的数据,并将这些数据输出
cut 选项 文件名
选项:
-f 1,2,..多列 :需要剪切第几列/多列
-f 3- 第三列以后的
-d "\t":指定分割符
10.2 sed
用法1:
查看一个文件中的某一行,或者某几行的内容
sed -n 'a,bp' song.txt读取自第a行到第b行的数据
例:
cut.txt中的内容是:
a aa
b bb
c cc
d dd
剪切出第一列的内容:
cut -f 1 -d " " cut.txt
输出的内容是:
a
b
c
d
例:
切取第三列”:“以后的:
echo $PATH | cut -d ":" -f 3-
用法2:
sed编辑器逐行处理文件输入,然后把结果发送到屏幕
sed 参数
参数:
-e:多重编译
sed -e ‘1,3d’ -e ‘s/abc/def/g’ file 删除1-3行,然后把其余行的abc替换成def
a/:追加一行
1.sed "2a 增加的内容" 针对的文件
--在第二行下面增加内容
2.sed "/文件中具体的文字/a\需要添加的内容" 针对的文件
d:删除
sed "/需要删除的内容/d" 针对的文件
s:替换
sed "s/需要替换的内容/替换内容/g" 针对的文件
g:global全局的