Introduction
Shell是一个用来与linux,unix系统进行交互的的解释型程序。Shell主要有两种使用方式,一种是直接通过shell terminal输入命令进行交互,一种是写好shell脚本程序,然后批量执行脚本里的命令。
第一个shell脚本hello.sh:
1 |
|
#!
指定执行这个脚本的解释器,常用的解释器有sh,bash。为了执行这个程序我们可以在terminal输入:
1 | chmod 777 hello.sh # 设置执行权限 |
或者:
1 | sh hello.sh |
sh
一般是在系统PATH里的,可以直接在terminal中使用该命令,一般PATH包含在/bin, /sbin, /usr/bin, /user/sbin
中,如果需要在terminal中直接使用某个命令,我们需要将其可执行程序加入到这些目录中,或者将该可执行程序的路径加入PATH中。
变量
- 定义和使用变量
shell不需要声明变量类型,可以直接定义变量或修改变量数据类型,注意定义变量是不要在变量名前$
符号。
var="hello, world"
在使用一个定义过的变量时,只需要在变量名前加$
符号,比较好的方式是同时对变量名加上花括号。
1 | echo $var |
- 在重新定义变量时,直接像第一次定义变量时定义:
1 | var="hello, world" |
- 通过
readonly
设置只读变量
1 | var="hello, world" |
- 删除变量(不能删除readonly变量)
1 | unset var |
- 变量类型
(1)局部变量,当前脚本定义的变量。
(2)环境变量,多个不同shell进程可使用的环境变量。
(3)shell变量,shell有特殊定义的变量。
- 一些shell变量
变量 | 含义 |
---|---|
$0 |
当前脚本文件名 |
$n |
传递给脚本的第n个参数 |
$# |
参数个数 |
$* |
所有参数,需要注意的是,所有被””包括的将作为单个参数 |
$@ |
所有参数,需要注意的是,被””包括的多个元素将作为各个不同参数 |
$? |
上个命令的退出状态,或函数的返回值。 |
$$$$ | 当前shell进程ID |
Shell替换
- 变量和字符替换
字符串中如果包含特殊字符或者变量,shell将会替换这些符号或变量,注意替换转义字符需要加上-e参数。
1 |
|
1 | hello, chen |
- 命令替换
1 | processInfo=`ps` # `,not ' |
Shell运算
使用expr表达式
1 | var=`expr 1+0` |
- 算术运算符
operator | example expression |
---|---|
+ | `expr $a + $b ` |
- | `expr $a - $b ` |
* | `expr $a * $b ` |
/ | `expr $a / $b ` |
% | `expr $a % $b ` |
= | a=$b |
== | [$a == $b] |
!= | [$a != $b] |
- 关系运算符
operator | example expression |
---|---|
-eq | [$a -eq $b] |
-ne | [$a -ne $b] |
-gt | [$a -gt $b] |
-lt | [$a -lt $b] |
-ge | [$a -ge $b] |
-le | [$a -le $b] |
- 逻辑运算符
operator | example expression |
---|---|
! | [! false] |
-o | [$a -lt 20 -o $b -gt 100 ] |
-a | [$a -lt 20 -a $b -gt 100 ] |
- 字符串运算符
operator | example expression |
---|---|
= | [ $a = $b ] |
!= | [ $a != $b ] |
-z | 长度是否为0, 为0则返回true,[-z $a] |
str | 字符串是否为空,不为空位返回true, [$a] |
- 文件测试运算符
expression | meaning |
---|---|
是块设备文件? | [ -b $file ] |
是字符设备文件? | [ -c $file ] |
是目录? | [ -d $file ] |
是普通文件? | [ -f $file ] |
是否可读 | [ -r $file ] |
是否可写 | [ -w $file ] |
是否可执行 | [ -x $file ] |
是否为空(文件大小是否大于0) | [ -s $file ] |
文件(包括目录)是否存在 | [ -e $file ] |
字符串
单引号字符串,内容不会被修改。
双引号字符串,字符串中可以出现变量和转义字符。
1 | var="chen" |
数组
- 定义数组
1 | first_array=(value0 value1 ...) #元素用空格分开 |
- 操作数组
1 | ${array_name[index]} # 一般格式 |
if else
1 | if[ expression ] |
case esac
1 | case $var in |
for
1 | for varible in list do |
while
1 | COUNTER=0 |
break, continue
1 | break |
function
- 定义
1 | function_name () { |
Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。
1 |
|
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
dict
1 | declare -A dict |
Shell输入输出重定向
文件包含
example
1 |
|