shell脚本学习

sh 的开头一般都是 #!/bin/bash
shell语法变量的名字

变量名=变量值 等号的两边不能有空格

变量名规范 不能以数字开头,字母数字下划线

输出变量内容 echo+变量名

admin@localhost 桌面]$ name=dadad
[admin@localhost 桌面]$ echo $name
dadad
[admin@localhost 桌面]$


释放掉变量名 unset + 变量名称

[admin@localhost 桌面]$ unset name
[admin@localhost 桌面]$ echo $name

[admin@localhost 桌面]$

特殊变量定义 带有空格的变量定义 双引号

[admin@localhost 桌面]$ name="chen dad"
[admin@localhost 桌面]$ echo $name
chen dad

单引号

[admin@localhost 桌面]$ name2='zhang san'
[admin@localhost 桌面]$ echo $name2
zhang san
[admin@localhost 桌面]$

双引号单引号的区别

使用双引号的变量
m="zhangzy$name"
[admin@localhost 桌面]$ echo $name
chen dad
[admin@localhost 桌面]$ m="zhangzy$name"
[admin@localhost 桌面]$ echo $m
zhangzychen dad
[admin@localhost 桌面]$ h="zhangzy \$name"

 

使用单引号定义变量

n='fabb $name'
[admin@localhost 桌面]$ n='fabb $name'
[admin@localhost 桌面]$ echo $n
fabb $name
[admin@localhost 桌面]$


反单引号 放的是使用到的命令
[admin@localhost ~]$ m=`ls`
[admin@localhost ~]$ echo $m
vmware-admin 公共的 模板 视频 图片 文档 下载 音乐 桌面

执行sh脚本
执行方法1
[admin@localhost lession1]$ sh script1.sh
/home/admin/桌面/data/lession1
sh不用考权限问题

执行方法2
[admin@localhost lession1]$ ./script1.sh
/home/admin/桌面/data/lession1
[admin@localhost lession1]$



#!/bin/bash
cd /etc
filecount=`ls -l|wc -l`
echo "该目录下有$filecount个文件"

改进 实现统计任何指定目录的文件个数 使用read命令

单变量

[admin@localhost lession1]$ read a
ada
[admin@localhost lession1]$ echo $a
ada


多变量 赋值
正常是一一对应如果多个赋值后,超出的赋值给最后的变量名
[admin@localhost lession1]$ read a b
chenliang zhangyuqi fanbb
[admin@localhost lession1]$ echo $a
chenliang
[admin@localhost lession1]$ echo $b
zhangyuqi fanbb

read可以添加提示信息
read -p "提示名称" 变量名

 

只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"
运行脚本,结果如下:

/bin/sh: NAME: This variable is read only.

 


定义外部输入目录

#!/bin/bash
#输入目录
read dir
#进入目录
cd $dir
filecount=`ls -l|wc -l`
echo "该目录下有$filecount个文件"

改进后

#!/bin/bash
#输入目录
read -p "请输入路径" dir
#进入目录
cd $dir
filecount=`ls -l|wc -l`
echo "该目录下有$filecount个文件"


参数传递
传递的第一个参数
#!/bin/bash
#进入目录
cd $1
filecount=`ls -l|wc -l`
echo "该目录下有$filecount个文件"

参数传递向.sh文件中传递数据 sh script4.sh /etc
文件中接受参数的方式 $1表示接受的第一个参数,$0显示是该文件的名称,$@显示所有参数 $#显示参数的个数


#!/bin/bash
echo "这个数据是$1"
[admin@localhost lession1]$ sh scrip5.sh 100
这个数据是100

其中$0显示是该文件的名称
$@显示所有参数


重定向

把内容输出都文件当中
1、把命令的内容输出到文件中,
(1)正确命令 用数字1表示
[admin@localhost lession1]$ ls 1>a.txt
[admin@localhost lession1]$ ls
a.txt scrip4.sh scrip5.sh script1.sh script2.sh script3.sh
[admin@localhost lession1]$ cat a.txt
a.txt
scrip4.sh
scrip5.sh
script1.sh
script2.sh
script3.sh

内容追加
ls /tmp 1>>a.txt

(2)错误命令 用数字2表示

[admin@localhost lession1]$ cd dadada 2>b.txt
[admin@localhost lession1]$ ls
a.txt b.txt scrip4.sh scrip5.sh script1.sh script2.sh script3.sh
[admin@localhost lession1]$ cat b.txt
bash: cd: dadada: 没有那个文件或目录

程序结构

分支结构

if...else 格式,条件两边要有空格,多个条件间要有空格,if后面要有空格,
条件中如果存在变量,$变量名,变量的两边要有双引号

if(空格)条件 (空格)
then
[语句]
else
[语句]
fi(结束if..else语句)

#!/bin/bash
dir=`ls /root`

if [ "$dir" == "" ]
then
echo "目录未空"
else
echo "目录不为空"
fi


[admin@localhost lession1]$ sh scrip6.sh
ls: 无法打开目录/root: 权限不够
目录未空


逻辑运算符
且: -a
或者:-o
非: !

 

#!/bin/bash
#提示用户名输入和密码
read -p "请输入用户名和密码" usename passwd

if [ "$usename" == "admin" -a "passwd" =="123456" ]
then
echo "登录成功"
else
echo "登录失败"
fi


比较运算符
数字间比较-------比较运算符 -eq 判断是否相等
-ne 判断是否不相等
-gt 判断是否大于
-ge 判断是否大于等于
-lt 判断是否小于
-le 判断是否等于小于


变量操作
i=i+1表示方法

((i++)) ((i+=1)) i=$[$i+1] let i=i+1 i=$(($i+1))



#!/bin/bash
#提示用户名输入和密码
read -p "请输入数字" num

if [ "$num" -gt 0]
then
((num--))
echo $num
else
((num++))
echo $num
fi


test文件状态

test 参数 变量名------>测试文件状态


-e 表示文件是否存在
-f 表文件是否存在且为文件
-d 表示文件名是否存在且为目录
-n

-r 可读
-w 可写
-x 可执行

#!bin/bash
read - "请输入目录" dir
if test -d $dir
then
count = `ls -l $dir|wc -l`
echo "$dir 文件下的文件个数为$count"
else
echo "$dir目录不存在"
fi


if..elif..else分支

if [ 条件 ]
then
语句
elif [ 条件 ]
then
语句
else [ 条件 ]
语句

fi


#!bin/bash

read -p "请输入分数" socore
if [ "$socore" -ge 90 -a "$socore" -le 100 ]
then
echo "优秀"



文件判断的知识点


#!bin/bash

read -p "请输入你的选项" chose

if [ "$chose" == "A" ]
then
echo "电灯"
elif[ "$chose" == "B" ]
then
echo "电脑"
else
echo "请输入正确的选项"
fi

 


case分支


case $变量名 in
"值")
语句;;
"值")
语句;;
.....
*)
语句;;
esac

 

需要注意
1、case第一行最后必须为in
2、;;代表的是结束语句
3、*代表默认语句
4、esac代表case语句的结束
5、值可以是数字也可以是字符串,也可以是范围[0-9]

#!bin/bash

read -p "请输入你的选项" chose

case $chose in
"A")
echo "电灯";;
"B")
echo "电脑"
*)
echo "请输入正确的选项"
esac

 

for循环结构

 

for 变量名 in 列表
do
语句
done

 


改进 seq start size max
start 开始点
size 间隔
max 结束点

for i in `seq 1 1 10`
do
echo $i
done

 

变量间相加间s=$(($变量名1+$变量名2))

while 循环

while [ 条件 ]
do
命令
done


计算1-100的总和


#!bin/bash

i =1
sum =0

while [ $i -le 100 ]
do
sum=$(($sum+$i))
((i++))
done
echo $sum

 

函数

函数名(){
代码
}


#!bin/bash

hello(){
echo "hello"
}

函数调用
先定义后调用

#!bin/bash

hello(){
echo "hello"
}

#函数调用
hello


函数传递参数

#!bin/bash

add(){
echo $1
echo $2

}

#函数调用传参
add 1 100


返回值
shell脚本中默认有返回值,函数中默认存在返回值


add(){
echo $1
echo $2

}

add
echo $? 查看返回值

 


cut ----->剪取

可以按照字节进行剪取 -b表示 一个空格一个字节,一个字母一个字节, 一个汉字三个字节
可以按照字符进行剪取 -c表示 一个汉字就是一个字符,一个空格就是一个字符
可以按照域进行剪取
按照分割符 -d 分割 -f 取得域的位置

想要取某一个文件前几行内容

1、可以按照字节进行剪取 -b表示
[admin@bogon etc]$ head -5 group
root:x:0:
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
sys:x:3:bin,adm
adm:x:4:adm,daemon
[admin@bogon etc]$ head -5 group|cut -b 1-4
root
bin:
daem
sys:
adm:

[admin@bogon etc]$ head -5 group|cut -b 4-
t:x:0:
:x:1:bin,daemon
mon:x:2:bin,daemon
:x:3:bin,adm
:x:4:adm,daemon
[admin@bogon etc]$


[admin@bogon etc]$ head -5 group|cut -b 1-2,4
rot
bi:
dam
sy:
ad:

 


2、可以按照字符的方式剪取
[admin@bogon etc]$ pwd|cut -c 1-4
/etc

3、按照分割符 -d


bin:x:1:bin,daemon
daemon:x:2:bin,daemon
sys:x:3:bin,adm
adm:x:4:adm,daemon

[admin@bogon etc]$ head -5 passwd|cut -d ":" -f 1
root
bin
daemon
adm
lp

 

向文件当中插入内容 sed -i "行号a内容"文件名
最后更新文件 source 文件名

posted @ 2020-11-11 16:42  自学随笔  阅读(29)  评论(0)    收藏  举报