更多参考菜鸟教程

1 shell脚本

1.1 shell:

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

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

Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

1.2 shell 脚本

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

业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。

1.3 运行shell脚本

运行之前要确保脚本文件是可执行的,如果不是,可以添加权限

  • 运行方式和可执行文件相同,输入文件的的路径即可运行
  • 当执行当前目录下的脚本文件是需要使用./前缀,否则shell会搜索PATH变量的路径,而非当前路径
  • 使用bash命令也可

2 变量

2.1 基础使用

注意,变量名和等号之间不能有空格。命名规则和其他语言一样。

name="xiaoming"
# 使用变量
echo $name
# 花括号可选
echo ${name}

#再次更改变量
name="haha"
echo $name

#只读变量,name之后就不可以被修改了
readonly name

#删除变量,使用unset,unset不能删除只读变量
var_name="heihei"
echo $var_name
unset var_name
echo $var_name

2.2 变量类型

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

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

2.3 字符串

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。

  • 单引号:任何字符都会原样输出,无法使用转义字符
  • 双引号:可以有变量,可以有转义字符
name="xiaoming"
greeting="hello,$xiaoming"
greeting_1='hello,$xiaoming'
greeting_2="${xiaoming},hello"
echo $greeting
echo $greeting_1

获取字符串长度,提取字符串

str="abcdefg"
echo ${#str}
echo ${str:1:3}

3 传递参数

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

类似的还有,$# 传递到脚本的参数个数

例子:

echo "Shell 传递参数实例!";
echo "参数个数为:$#";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

设置脚本可执行权限,并执行后的结果为:

zylai@zylai-virtual-machine:~/exp1$ chmod +x params.sh 
zylai@zylai-virtual-machine:~/exp1$ bash params.sh 
Shell 传递参数实例!
参数个数为:0
执行的文件名:params.sh
第一个参数为:
第二个参数为:
第三个参数为:
zylai@zylai-virtual-machine:~/exp1$ bash params.sh h1 h2 
Shell 传递参数实例!
参数个数为:2
执行的文件名:params.sh
第一个参数为:h1
第二个参数为:h2
第三个参数为:
zylai@zylai-virtual-machine:~/exp1$ 

4 test命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。


数值测试

参数说明
-eq等于则为真
-ne不等于则为真
-gt大于则为真
-ge大于等于则为真
-lt小于则为真
-le小于等于则为真
num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

输出结果:

两个数相等!

代码中的 [] 执行基本的算数运算,如:

#!/bin/bash

a=5
b=6

result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"

#result 为: 11

字符串测试

参数说明
=等于则为真
!=不相等则为真
-z 字符串字符串的长度为零则为真
-n 字符串字符串的长度不为零则为真
num1="ru1noob"
num2="runoob"
**if** **test** $num1 = $num2
**then**
  **echo** '两个字符串相等!'
**else**
  **echo** '两个字符串不相等!'
**fi**

输出结果:

两个字符串不相等!

文件测试

参数说明
-e 文件名如果文件存在则为真
-r 文件名如果文件存在且可读则为真
-w 文件名如果文件存在且可写则为真
-x 文件名如果文件存在且可执行则为真
-s 文件名如果文件存在且至少有一个字符则为真
-d 文件名如果文件存在且为目录则为真
-f 文件名如果文件存在且为普通文件则为真
-c 文件名如果文件存在且为字符型特殊文件则为真
-b 文件名如果文件存在且为块特殊文件则为真
cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

输出结果:

文件已存在!

另外,Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。例如:

cd /bin
if test -e ./notFile -o -e ./bash
then
    echo '至少有一个文件存在!'
else
    echo '两个文件都不存在'
fi

输出结果:

至少有一个文件存在!

5 流程控制

5.1 if else

末尾用fi结束,符合条件的判断后面加then

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

例子:

a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

#结果:a 小于 b

经常和test命令一起使用

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi

更多推荐

【Linux】shell教程