shell常用命令

一个人想着一个人 提交于 2019-11-28 08:39:46

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

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!