1. 简介
1). 介绍
Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务
2). Shell 脚本
Shell 脚本(shell script),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell script是两个不同的概念。由于习惯的原因,简洁起见,本文出现的"shell编程"都是指shell脚本编程,不是指开发shell自身。
3). HelloWorld.sh
文件内容:
#!/bin/bash
echo "Hello World !"
执行过程:
# 创建helloworld.sh文件
[mazaiting@localhost shell]$ vim helloworld.sh
# 第一种运行方法:作为解释器参数
[mazaiting@localhost shell]$ /bin/sh helloworld.sh
Hello World!
# 第一种运行方法:作为可执行程序
[mazaiting@localhost shell]$ ./helloworld.sh
# 权限拒绝
bash: ./helloworld.sh: Permission denied
# 修改文件权限
[mazaiting@localhost shell]$ chmod +x ./helloworld.sh
# 执行
[mazaiting@localhost shell]$ ./helloworld.sh
Hello World!
2. 变量
1). 变量
test1.sh文件内容:
#!/bin/bash
# 定义变量
your_name="mazaiting"
# 打印变量
echo $your_name
# 建议使用变量时加上{}
echo ${your_name}
# 重新为变量赋值
your_name="tom"
# 重新打印变量的值
echo ${your_name}
执行过程:
2). 单双引号的区别
- 单引号:
单引号字符串的限制:- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
str='this is a string'
- 双引号:
双引号的优点:- 双引号里可以有变量
- 双引号里可以出现转义字符
your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
3). 字符串操作
I. 拼接字符串
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
II. 获取字符串长度
string="abcd"
echo ${#string} #输出 4
III. 提取子字符串
string="alibaba is a great company"
echo ${string:1:4} #输出liba
IV. 查找子字符串
string="alibaba is a great company"
echo `expr index "$string" is`
4). 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
- 定义数组
在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
- 读取数组
读取数组元素值的一般格式是:
${数组名[下标]}
- 获取数组长度
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
5). Shell 注释
以"#"开头的行就是注释,会被解释器忽略。sh里没有多行注释,只能每一行加一个#号。
#3. 传递参数
1). Shell 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
示例:
#!/bin/bash
echo "first param: ${0}"
echo "second param: ${1}"
echo "third param: ${2}"
打印结果:
特殊字符处理参数:
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。如"1 n"的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与@"用「"」括起来的情况、以"2" … "$n" 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
示例:
#!/bin/bash
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
打印结果:
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3
@ 区别:
- 相同点:都是引用所有参数。
- 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
2). expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
示例:
#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
注意使用的是反引号 ` 而不是单引号 '
打印结果:
两数之和为 : 4
3). printf 是比echo功能更强大的打印工具
4). test命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
5). if语句
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi
6). for语句
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
7). while语句
while condition
do
command
done
8). 无线循环
while :
do
command
done
或者
while true
do
command
done
或者
for (( ; ; ))`
9). case 语句
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
10). break
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
break
;;
esac
done
11). continue
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done
12). esac
case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。
4. 函数
1). 无参函数
#!/bin/bash
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
2). 有参函数
#!/bin/bash
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
3). 输入输出重定向
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
4). 文件包含
. filename # 注意点号(.)和文件名中间有一空格
或
source filename