文章目录
1.入门
shell脚本一般都是以.sh结尾,第一行标准的写法是:#!/bin/bash
例如有个hello.sh文件,内容如下:
#!/bin/bash
echo "Hello,World"
然后给脚本添加执行权限:
chmod u+x hello.sh
执行脚本,结果如下:
[root@JD ~]# ./test.sh
Hello,World
也可以通过下面这个方式去执行:
[root@JD ~]# sh test.sh
Hello,World
debug模式:
[root@JD ~]# sh -x test.sh
+ echo Hello,World
Hello,World
2.变量定义与引用
变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)
变量的定义方式:
key=value
创建一个variable.sh文件,内容如下:
#!/bin/bash
NAME="zhangsan"
DATE1="date"
DATE2=`date`
echo $NAME
echo ${DATE1}
echo ${DATE2}
执行脚本:
zhangsan
date
Fri Aug 23 12:30:47 CST 2019
注意点:
1."="前后不能有空格
2.变量名称一般来说,都大写
3.使用变量习惯用{}
3.传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
其中 $0 为执行的文件名
创建parameter.sh文件,并输入下面内容
#!/bin/bash
echo "文件名:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "参数个数:$#"
echo "传递的参数作为一个字符串为:$*"
echo "此脚本运行时的pid为:$$"
执行parameter.sh文件,传的参数为hello 和world:
[root@JD ~]# ./parameter.sh hello world
文件名:./parameter.sh
第一个参数:hello
第二个参数:world
参数个数:2
传递的参数作为一个字符串为:hello world
此脚本运行时的pid为:7987
假如我们传入"hello world",那就是作为一个参数,执行结果如下
文件名:./parameter.sh
第一个参数:hello world
第二个参数:
参数个数:1
传递的参数作为一个字符串为:hello world
此脚本运行时的pid为:8315
4.数组
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 ... valuen)
定义一个array.sh文件,内容如下:
#!/bin/bash
arr=(zhangsan lisi wangwu zhaoliu)
echo "所有数组元素:${arr[@]}"
echo "第2个元素:${arr[1]}"
echo "数组元素个数:${#arr[@]}"
然后执行结果如下:
所有数组元素:zhangsan lisi wangwu zhaoliu
第2个元素:lisi
数组元素个数:4
5.流程控制if
5.1 if else 语法
语法格式:
if condition ;then
command1
command2
...
commandN
else
command
fi
有如下内容的脚本if.sh
#!/bin/bash
A="zhangsan"
B="lisi"
if [ ${A} == ${B} ] ; then
echo "${A}==${B}"
else
echo "${A}!=${B}"
fi
注意:
1.[ ] 前后要留空格
2.== 前后要留空格
执行脚本,结果如下:
zhangsan!=lisi
5.2 if else-if else 语法
语法格式:
if condition1 ;then
command1
elif condition2 ;then
command2
else
commandN
fi
又如下elif.sh文件:
#!/bin/bash
A=59
if [ ${A} -gt 90 ];then
echo "优"
elif [ ${A} -ge 60 ];then
echo "良"
else
echo "差"
fi
运行结果:
差
6.流程控制for while
6.1 for循环
1.一般格式如下:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
准备如下的脚本
#!/bin/bash
for x in 1 2 3 4 5
do
echo "value is ${x}"
done
执行结果:
value is 1
value is 2
value is 3
value is 4
value is 5
2.另外一种执行代码:
for((i=0;i<10);i++)
do
echo "value is ${i}"
done
执行结果:
value is 0
value is 1
value is 2
value is 3
value is 4
value is 5
value is 6
value is 7
value is 8
value is 9
6.2 while循环
语法格式:
while condition
do
command
done
脚本内容:
#!/bin/bash
j=1
while ((${j}<=5))
do
echo ${j}
let "j++"
done
结果如下:
1
2
3
4
5
7.分割
有如下字符串,需要分割
str="zhangsan,lisi,wangwu,zhaoliu"
分割脚本如下:
#!/bin/bash
str="zhangsan,lisi,wangwu,zhaoliu"
OLD_IFS="${IFS}"
IFS=","
arr=(${str})
IFS=${OLD_IFS}
for x in ${arr[@]}
do
echo ${x}
done
结果如下:
zhangsan
lisi
wangwu
zhaoliu
8.awk
有个文件test.log,内容如下:
a b c
1 2 3
1.获取第一列数据
cat test.log | awk '{print $1}'
结果:
a
1
2.获取第一列和第二列
cat test.log | awk '{print $1,$2}'
结果:
a b
1 2
3.获取第一行
cat test.log | awk 'NR==1{print}'
结果:
a b c
4.获取第一行,第一列
cat test.log | awk 'NR==1{print $1}'
结果:
a
5.获取第二行往下的数据
cat test.log | awk 'NR>1{print}'
结果:
1 2 3
9.sed
1.替换
比如有文件test.log文件,内容如下:
a a b
1 a 3
把a替换成dd,每行第一次遇到的a换成dd
sed -i 's/a/dd/' test.log
运行结果如下:
2.把dd换成aa’
sed -i "s/dd/aa'/" test.log
因为替换的字符串里单引号,所以外面一层要使用双引号
3.全局替换
把所有a都换成d
sed -i 's/a/d/g' test.log
来源:https://blog.csdn.net/u010452388/article/details/100033954