shell的分类

  1. bash 大多数Linux系统默认使用的shell,bash shell 是最早的 unix shell。基本涵盖了shell所具有的全部功能。
  2. zsh 目前Linux里最为庞大的shell命令,具有84个内部指令,和bash具有一定的兼容性。
  3. csh(全称 C Shell): 是一种比 Bourne Shell更适合的变种 Shell,它的语法与 C 语言很相似。内部指令为52个,目前使用不多
  4. tcsh 是csh的增强版,与C shell具有完全兼容性。

指定你的shell类型

在首行告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

#!/bin/bash
#! /usr/bin/csh

第一个shell脚本

  1. 打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好。

    #!/bin/bash
    echo "Hello Shell !"
  2. 为shell脚本赋予执行权限

    # 为test.sh赋予执行权限
    chmod +x ./test.sh
    # 执行脚本
    ./test.sh

    chmod +x file 加上执行权限,否则会提示无执行权限。

    一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 系统的 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

shell变量

定义变量

  1. 定义变量时,变量名不加美元符号

    name="bobo"
  2. 变量名命名规则

    1. 首字符必须为字母(a-z,A-Z)
    2. 中间不能使用空格,但是可以有_
    3. 不能使用bash里的关键词

使用变量

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

    name="bobo"
    echo $name
    echo ${name}
    #变量名外面的花括号是可选的
    #加花括号是为了帮助解释器识别变量的边界
    # 如果不给skill加{}解释器将把skillScript作为一个变量,但这个变量值为空
    for skill in Ada Coffe Action Java;
    do
    echo "I am good at ${skill}Script"
    done

shell字符串

  1. 字符串是shell编程中最常用的数据类型,字符串可以用单引号,也可以用双引号。

单引

#等号赋值,左右两边不可以有空格
name=‘杜波’
  1. 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
  2. 单引号字串中不能出现单引号,转义符后也不行

双引号

name='dubo'
str="Hello,\"$name\"!" #(\是转义符号)
  1. 双引号里可以有变量
  2. 双引号里可以有转义符号

字符串拼接

your_name="dubo"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !" # 推荐使用
echo $greeting $greeting_1

提取子字符串

url="www.mrdubo.com"
echo ${url:1:4} # 输出 ww.m 从位置1开始输出,输出4位

shell数组

  1. bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
  2. 数组元素的下标由0开始编号。
# shell数组 用空格分割
value=("values1" "values2" "values3" "values4" "values5")

读取数组

${数组名[下标]}
${array_name[0]
使用@符号可以获取数组中的所有元素
echo ${array_name[@]}
使用#符号可以获取数组中的所有元素
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

Shell 传递参数

  1. 在执行 Shell 脚本时,可以向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数。
echo "Shell 传递参数实例!";
echo "执行的文件名:${0}";
echo "第一个参数为:${1}";
echo "第二个参数为:${2}";
echo "第三个参数为:${3}";
chmod +x test.sh
./test.sh 1 2 3
echo "Shell 传递参数实例!";
echo "执行的文件名:test.sh";
echo "第一个参数为:1";
echo "第二个参数为:2";
echo "第三个参数为:3";

Shell 基本运算符

  1. 算数运算符
**原生bash不支持简单的数学运算,但是可以通过其他命令来实现,其中expr 最常用。**

value =`expr 2 + 2`
echo ${value}
val=`expr $a \* $b`
echo "a * b : $val"
# `是反引号 表示执行命令
# 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,
# 乘法要在*号前加\
  1. 关系运算符

    关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

  1. 字符串运算符

# 命令和选项之间必须有空格
a="abc"
b="efg"
if [ $a = $b ]
then
echo "a=b"
else
echo "a!=b"
if[ -z $a ]
if[ -n $a ]
if[ $str ]
```
4. 逻辑运算符
![](http://od4y7wzt7.bkt.clouddn.com/15124769986543.jpg)
```bash
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
#if 在判断逻辑运算符时需要两层的[]

shell流程控制

if else

if [condition]
then
command 1
command 2
fi
########################
# 在同一行中要使用;
if [condition];then command1;fi
########################
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

for循环

for var in list
do
commands
done
for loop in 1 2 3 4 5
do
echo "The value is: ${loop}"
done
######循环数组#####
array_name=("value0" "value1" "value2" "value3")
for loop in ${array_name[@]}
do
echo "The value is: ${loop}"
done

while循环

while condition
do
command
done
int=1
#while 2层()并且变量与()之间要有空格
while(( $int<=5 ))
do
echo $int
int=$[$int+1]
#let int=$int+1
#int 自增的方式
done

case选择

casein
case1)
command1
command2
...
commandN
;;
case2)
command1
command2
...
commandN
;;
esac
####### 举例
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac

Shell 输入/输出重定向

输出/输出重定向

#输出重定向
command1 > file1
#输入重定向
command1 < file1
###事例
#将当前用户信息添加到users.txt下
who > users.txt
#不进行覆盖使用
who >> users.txt

Shell脚本嵌套

Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

#./text.sh
url="http://blog.mrdubo.com"
#./test.sh
#使用 . 号来引用test1.sh 文件
.和./text.sh有空格
. ./text.sh
# 或者使用以下包含文件代码
# source ./test1.sh
echo $url