0%

Linux Shell教程

Shell教程

Shell是一个C语言编写的教程,他是用户使用Linux的桥梁。Shell即是一种命令语言,有事一种程序设计语言。
Shell是指一种应用程序,这个应用程序提供一个界面,用户通过这个界面访问操作系统内核的服务

Shell脚本

Shell脚本(shell script),是一种为shell编写的脚本程序

第一个Shell脚本

打开文本编辑器(vi/vim创建文件),新建一个test.sh

1
2
#!/bin/bash
echo "Hello World!"
  • 其中#!是一个约定的标记,他告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell
  • echo命令是用于向窗口输出文本
    1
    2
    chmod +x test.sh #给脚本赋可执行权限
    ./test.sh

Shell变量

定义变量,如下

1
2
echo_str="Hello World ehco"
echo $echo_str

注意:变量名和等号之间不能有空格,同时需要遵循如下规则:

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

除了显式地直接赋值,,还可以用语句给变量赋值

1
2
3
4
5
for file in `ls /etc`;do
echo $file
done

for file in $(ls /etc)

使用变量

使用一个定义过的变量,只要在变量名前面加一个美元符号即可

1
2
3
your_name="Hello World"
echo $your_name
echo ${your_name}

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

1
2
3
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done

只读变量

使用readonly命令可以讲变量定义为只读变量,只读变量的值不能被改变
下面的例子是尝试更改只读变量,结果报错

1
2
3
4
#!/bin/bash
myUrl="http://www.baidu.com"
readonly myUrl
myUrl="http://xyd.com"

运行脚本后会报如下错误

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

删除变量

使用unset命令可以删除变量

1
unset variable_name

变量被删除后不能再次使用。unset命令不能删除只读变量

变量类型

运行shell时,会同时存在三种变量:

  • 局部变量:局部变量在脚本或命令中定义,尽在当前shell实例中有效,其他shell启动的程序不能访问局部变量
  • 环境变量:所有的程序,包含shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本可以定义环境变量
  • Shell变量:shell变量是由Shell程序设置的特殊变量。Shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证Shell的正常运行

Shell字符串

字符串是Shell中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号

单引号

1
2
3
danyinhao='danyinhao'
danyinhao='dan''yinhao'
echo $danyinhao

单引号字符串的限制:

  • 单引号里的任何字符都会鸳鸯输出,单引号字符串中的变量是无效的
  • 单引号子串中不能出现单独一个单引号,但可以承兑出现,作为字符串拼接

双引号

1
2
3
4
5
#!/bin/bash

you_name="test name"
str="Hello,I know you are \"${you_name}\"! "
echo -e $str

输出内容如下

1
Hello,I know you are "test name"!

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

拼接字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

your_name="Daniel"

# 使用双引号拼接
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

执行输出结果

1
2
hello,Daniel! hello Daniel!
hello,Daniel! hello,${your_name}!

因此单引号不支持${}输出变量内容

获取字符串长度

1
2
string="abcd"
echo ${#string} #输出4

提取子字符串

下面实例从字符串第2个字符开始截取4个字符

1
2
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

查找子字符串

查找字符i或o的位置(那个字母先出现就计算哪个)

1
2
3
#/bin/bash
string="runoob is a great site"
echo `expr index "$string" io` #输出4

Shell数组

Shell相关实例

查询软件是否安装

1
2
3
4
5
6
7
#或者pName=`exec rpm -qa|grep mariadb`
pName=$(rpm -qa | grep mariadb)
if [ $? -eq 0 ]
then
echo "软件包"${pName}"已经安装。"
else
echo "软件包"${package}"没有安装"

for循环遍历打印rpm安装的包

1
2
3
4
#!/bin/bash
for package in `rpm -qa|grep mysql-community*`; do
echo $package
done