Shell
Shell 是一个用C语言编写的程序,它既是一种命令语言,又是一种程序设计语言。
Shell Script
Shell脚本,用shell编写的脚本程序
First Shell
- 创建一个
.sh
为文件后缀的文件,hello.sh
- 内容如下
1
2
3
4!/bin/bash
注释
author : jeremy
echo "Hello Shell !"
保存退出
先赋予执行权限
1
chmod a+x hello.sh
执行
1
./hello.sh
变量
定义变量
1 | variable_name=variable_value |
访问变量
使用美元符号$
访问变量,可以给变量加上{ }
花括号,帮助解释器识别变量的边界1
2
3
4
5
6!/bin/sh
User="Jeremy"
Pwd=“123456”
echo $User
echo ${Pwd}
打印 User
和 Pwd
的值
只读变量
使用readonly
可以将变量定义为只读变量,只读变量的值不能改变1
2
3
4!/bin/sh
User="Jeremy"
readonly User
删除变量
使用unset
命令可以删除变量1
2
3
4!/bin/sh
User="Jeremy"
unset User
变量类型
局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效
环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证正常运行,shell脚本也可以定义环境变量
shell变量
shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
特殊变量
1 | 0 当前脚本的文件名 |
数组Arrays
Bash Shell只支持一维数组,初始化时不需要定义数组大小1
array_name=(value1...valueN)
定义数组
1 | array_name[index]=value |
访问数组
和访问变量格式相同1
2
3
4
5
6
7
8
9
10
11{array_name[index]}
ex:
User[0]="apple"
User[1]="banana"
User[2]="orange"
echo ${User[0]}
echo ${User[@]}
以下两种方式可以访问数组中的所有项目
{array_name[*]}
{array_name[@]}
基本运算符
Bourne shell没有任何机制来执行简单的算术,它使用外部程序awk或expr
- 运算符和表达式之间必须有空格
- ` ` 倒逗号之间包含完整的表达式
1 | !/bin/sh |
算术运算符
a=10
b=20
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | ` expr $a + $b ` 结果为 30。 |
- | 减法 | ` expr $a - $b ` 结果为 -10。 |
* | 乘法 | ` expr $a * $b ` 结果为 200。 |
/ | 除法 | ` expr $b / $a ` 结果为 2。 |
% | 取余 | ` expr $b % $a ` 结果为 0。 |
= | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
== | 相等 | [$a==$b] 返回 false。 |
!= | 不相等 | [$a!=$b] 返回 true。 |
关系运算符
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
布尔运算符
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否为0,不为0返回 true。 | [ -n “$a” ] 返回 true。 |
str | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
Shell条件语句
if … fi
shell expression求值,结果是true,statement被执行,否则不执行1
2
3
4if[ expression ]
then
Statement(s) to be executed if expression is true
fi
if … else … fi
1 | if[ expression ] |
if … elif … fi
1 | if [ expression 1 ] |
case .. esac
这里的字符串字每个模式进行比较,直到找到一个匹配。执行语句匹配模式。如果没有找到匹配,声明退出的情况下不执行任何动作。
没有最大数量的模式,但最小是一个。
当语句部分执行,命令;;
表明程序流程跳转到结束整个 case 语句。和C编程语言的 break 类似。1
2
3
4
5
6
7
8
9
10
11case word in
pattern1)
Statement(s) to be executed if pattern1 matches
;;
pattern2)
Statement(s) to be executed if pattern2 matches
;;
pattern3)
Statement(s) to be executed if pattern3 matches
;;
esac
Shell循环类型
while 循环
这里Shell命令进行计算。如果结果值是 true,给定语句被执行。如果命令为 false,那么没有语句将不执行,程序将跳转到done语句后的下一行。1
2
3
4while command
do
Statement(s) to be executed if command is true
done
for 循环
var是一个变量,word1 到 wordN 是由空格分隔的字符(字)序列的名称。每次for 循环的执行,变量var的值被设置为下一个单词的列表中的字,word1 到 wordN 。1
2
3
4for var in word1 word2 ... wordN
do
Statement(s) to be executed if command is true
done
until 循环
这里Shell命令进行评估计算。如果结果值是false,给定语句(s)被执行。如果命令没有语句为true,那么将不执行,程序会跳转到下一行done语句后。1
2
3
4until command
do
Statement(s) to be executed until command is true
done
select 循环
var是一个变量,word1 到 wordN是由空格分隔的字符(字)序列的名称。每次for循环的执行,变量var的值被设置为下一个单词的列表中的字,由 word1 到wordN。
对于每一个选择的一组命令将被执行,在循环中。这个循环在ksh,并已被改编成的bash。这不是在sh。1
2
3
4select var in word1 word2 ... wordN
do
Statement(s) to be executed for every word.
done