linux系统中shell脚本最全详解一&概念、参数传递、基础命令

目录

一、什么是shell脚本?

1、shell的概念:

2、shell 执行环境

3、编辑第一个shell脚本

4、shell变量介绍

5、shell字符串

6、shell数组

二、shell参数传递

三、shell基础命令介绍

1、find查找命令

2、sed命令介绍

3、grep命令介绍

4、cut命令介绍


一、什么是shell脚本?


1、shell的概念:

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。

Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

简单的说就是用户和内核之间进行通信/沟通的翻译官。极大减少了操作人员的工作量。

2、shell 执行环境

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

系统提供多种shell程序,查看linux系统下的shell文件目录命令:cat  /etc/shells ,显示结果如下所示:

[root@localhost ~]# cat  /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

3、编辑第一个shell脚本

打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 first_shell.sh

写好之后执行该脚本,运行shell脚本的两种方法:

1先赋权再执行

为脚本赋予执行权限命令:chmod +x ./first_shell.sh

执行脚本命令:sh ./first_shell.sh

2、直接执行 sh test.sh

实例:

进入根目录:[root@localhost /]# cd /

创建home文件夹用来存储shell脚本:[root@localhost /]# mkdir home

进入home文件夹下,新建一个shell脚本文件 first_shell.sh: vim first_shell.sh

编辑内容:

#!/bin/bash

echo "Hello World !"

[root@localhost home]# vim first_shell.sh 
[root@localhost home]# sh first_shell.sh 
first_shell.sh: line 2: echo Hello World !: command not found
[root@localhost home]# 

4、shell变量介绍

定义一个变量:your_name="chenzhe"

注意:shell脚本编写时,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。

同时,变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。

使用变量:echo $your_name,既:echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

例如:

boy="good"

echo "you are my $boyfriend" //$boyfriend值为空

改为

echo "you are my ${boy}friend"

实例:vim first_shell.sh  编写如下内容

#!/bin/bash
echo "Hello World !"

boy="good"
echo "you are my ${boy}friend" 

执行后显示:

[root@localhost home]# vim first_shell.sh 
[root@localhost home]# sh first_shell.sh 
first_shell.sh: line 2: echo Hello World !: command not found
you are my goodfriend
[root@localhost home]# 

另外:已经定义的变量可以重新定义,但是如果是只读的则不可以

        your_name="tom"
        echo $your_name
        your_name="alibaba"
        echo $your_name

readonly +变量名 //表示这个变量只读,不能重新赋值

删除变量

unset[空格] 变量名(不能删除只读变量)

5、shell字符串

1、单引号中的内容会被当作普通字符串(java的String)来处理。案例:

# bash
x='$LANG'
echo $x

#输出: $LANG

2、双引号中的内容会按照其原本的属性进行输出。案例:

# bash
x="$LANG"
echo $x

#输出:zh_CN.UTF-8

3、可用转义字符“\”将特殊符号(如$、\、!等)变为一般字符。案例:

your_name='chenzhe'
str="Hello, I know you are \"$your_name\"! "
echo -e $str

输出:Hello, I know you are "chenzhe"!

4,拼接字符串。案例:

your_name="piaolaoshi"
# 使用双引号拼接
greeting="hello, "$your_name
greeting_1="hello, ${your_name}"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' ! '
greeting_3='hello, ${your_name} ! '
echo $greeting_2  $greeting_3

#输出:hello, piaolaoshi  hello, piaolaoshi
      hello, piaolaoshi !   hello, ${your_name} !

5,获取字符串长度

string="abcd"
echo ${#string}

 #输出 4

6,获取子字符串

string="mayun is a great man"
echo ${string:1:4} 

# 输出ayun

6、shell数组

定义数组: 数组名=(值1 值2 值3 值4)。案例:

array=(1 2 3 4)
echo ${array[1]}   #输出:2

利用@可以获取元素当中的所有元素。案例:

echo ${array[@]}  #输出:1 2 3 4

可以给数组单独赋值

#bin/bash
array[1]=89

#获取数组的长度
# 取得数组元素的个数
length=${#array[@]}
echo $length  #输出:1

# 或者
length=${#array[*]}
echo $length   #输出:1

# 取得数组单个元素的长度
array=(mayun mahuateng leijun liuqiangdong)
length=${#array[n]}
echo $length   输出:5

二、shell参数传递


我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

几个特殊字符用来处理参数(其中标红部分是重点需要掌握的,其他的作为了解):

S# 传递到脚本的参数个数
$*

以一个单字符串显示所有向脚本传递的参数。

如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

$@

与$*相同,但是使用时加引号,并在引号中返回每个参数。

如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

$! 后台运行的最后一个进程的ID号
$$ 脚本运行的当前进程ID号
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。


 

 

 

 

 

 

 

 

$* 与 $@ 区别,vim test01_shell.sh案例:

#! /bin/bash
test() {
        echo "未加引号,二者相同"
        echo $*
        echo $@
        echo "加入引号后对比"
	echo "----"\$*----""
        for N in "$*"
        do
           echo $N
        done

	echo "----"\$@----""
        for N in "$@"
        do
           echo $N
        done
}
test  11 22 33

输出结果:

[root@bgx shell]# sh test01_shell.sh
未加引号,二者相同
11 22 33
11 22 33
加入引号后对比
----$*----
11 22 33
----$@----
11
22
33

可以看出不加引号时,二者都是返回传入的参数,但加了引号后,此时$*把参数作为一个字符串整体(单字符串)返回,$@把每个参数作为一个字符串返回

 

三、shell基础命令介绍


1、find查找命令

由于Linux系统大部分都是应用于服务器上,所以查询数据的时候并没有图形化界面查找数据的便捷性。

语法:find [path] [选项] 参数。       

选项:

-name

按文件名查询

-perm

按文件权限查询

-size

按文件的大小查找

-user

按用户(属主)查询

-group

按用户组查询

-nogroup

查没有用户组的

-mtime

按文件的修改时间来查询

-type

按文件的类型查询

b  -  块设备文件。    

d  -  目录。    

c  -  字符设备文件。    

p  -  管道文件。    

l  -  符号链接文件。  (这是个小写的L)   

f  -  普通文件。

案例:

查找jdk安装的目录。

# bash

find / -name java

查找当前系统中所有的.java后缀名的文件

# bash

find / -name "*.log"

查找系统中/home目录下的非普通文件

# bash

find /home ! -type f

查找当前用户/home目录下权限为700的文件

#bash

find /home -perm 700

查找/dev目录下的块设备文件

#bash

find /dev -type b

2、sed命令介绍

sed本身是一个逐行处理工具,会逐行处理到文件的结束。默认情况下不修改源文件,因为sed是将源文件内容逐行copy到一个临时缓冲区(模式空间),对其进行编辑,行处理结束后,将其输出到屏幕上,也可以通过数据重定向将结果导入到新的文件中去。

sed本身提供修改源文件的选项。但是如果修改源文件时,结果内容并不会发送到屏幕上。

语法:sed  [option]  "[action]"  [filename] 

选项:

-e

允许对输入数据应用多条sed命令进行编辑。

-i

表示直接操作源文件

动作:

s:

字符串匹配/查找

i:

插入

a:

追加

d:

删除

c:

替换

注意:选项和动作的字母i不是同样的功能。

案例:

源文件内容(demo):

hello  teduhadoop

hello  hadoop

hello  hdfs ,hi  sed

1、将全文的h替换为H。

# bash

sed "s/h/H/g" demo

2、修改全文的h/H,第一个l/L

# bash

sed -e "s/h/H/g" -e "s/l/L/1" demo

or

# 多条指令的另外一种写法:

sed "s/h/H/g;s/l/L/1" demo

3、修改全文的第一个和第二个h/H

# bash

sed "s/h/H/1;s/h/H/1" demo

4、部分文件中,由于不知道是第几行,且文件中存在多个相同的字符串时,如何修改。

# eth0文件内容:

DEVICE=eth0
HWADDR=00:0c:29:37:f6:95
TYPE=Ethernet
UUID=5c4fcaf0-7f4f-4ab1-8dee-a96aecb23823
ONBOOT=no
NM_CONTROLLED=yes
BOOTPROTO=dhcp
DNS2=8.8.8.8
DNS1=114.114.114.114
IPV6INIT=no
USERCTL=no
PEERDNS=yes

将文件中的ONBOOT=no修改为ONBOOT=yes

# bash
sed -i "s/ONBOOT=no/ONBOOT=yes/g" eth0

5、在文件中进行插入新的内容:

源文件内容:

hello  teduhadoop
hello  hadoop
hello  hdfs ,hi  sed
5.1、在第一行插入内容"hello bigdata"

# bash

sed "1 i hello bigdata" demo

5.2、在第一行追加内容"hello 小强"

# bash

sed "1 a hello 小强" demo

6、删除匹配的行

# bash

sed "/hdfs/d" demo

表示将匹配的到hdfs的整行删除,如果匹配的内容是h的话,当前文件的内容会被全部删除。

3、grep命令介绍

这是一款强大文本搜索工具选项:

-number

同时显示匹配行上下的n行

-b,--byte-offset

 印匹配行前面打印该行所在的块号码。  

-c,--count  

只打印匹配的行数,不显示匹配的内容。  

-i,--ignore-case  

忽略大小写差别。  

-q,--quiet  

取消显示,只返回退出状态。0则表示找到了匹配的行。

--color

将匹配内容上色区分

-n,--line-number

在匹配的行前面打印行号。

-v,--revert-match

反检索,只显示不匹配的行。

#bash

cd /root

ls |grep -2 log  #匹配上下两行

ls |grep -n log  #匹配行号

ls | grep  log --color

tail:

文本监控,通常情况下用于监视文件的增长。

场景:大数据环境中,很多软件在启动时,不会将真正的启动/过程日志打印在屏幕上,因为内容繁多,会影响程序员观察启动过程中,哪个进程没有启动。像此种场景,我们就可以利用tail工具用来监视该软件启动日志文件的实际内容。

语法:tail [选项] fileName

选项:

-f 用于监控文件的增长

-n

从指定的行中进行监控文件的内容

4、cut命令介绍

cut命令在文件中负责剪切数据用的

选项:

-b  

字节  

-c  

字符  

-f   

提取第几列     

-d  

按指定分隔符分割列

案例:

源文件内容:

192.168.1.1
192.168.1.3
192.168.1.5
192.168.1.4

截取第11个字节:

# bash

cut -b 11 demo

截取第7-9的字节

# bash

cut -b 7-9 demo

截取最后一个字节进行排序:

# bash

cut -b 11 demo | sort

以点为 分隔符 获取第二个字段

# bash

cut -d . -f 2 demo

历史命令:

history

该命令可以用来查看Linux系统中曾经执行过的命令(默认1000条)。

用法:

!!  

运行上一条命令  

!88  

运行第88条命令  

!88  /test  

运行第88条命令并在命令后面加上/test  (可以用ls举例)

!ls  

运行上一个ls命令  

!ls:s/CF/l  

运行上一个ls命令,其中把CF替换成l  

history -c

表示清除历史命令  #  学习阶段不要使用此命令,会清空历史命令,不利于学习

四、linux系统中shell脚本最全详解二 

       由于内容太多,需要的小伙伴请自行查看下一篇,下面附上链接:

linux系统中shell脚本最全详解二&shell条件判断&语法介绍&函数分析

 

总结不易,期待您的关注,我们一起进步,冲冲冲!!!

 

你可能感兴趣的:(Linux系统,shell,linux)