shell简介
shell种类
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
使用
cat /etc/shells
查看当前系统可用的shell。其中,/bin/bash
易用免费,因此常被用到。在脚本中的第一行开头使用#!指定使用什么种类,如果在终端执行的时候前面指定,则脚本中的无效。
1、shell变量
定义变量: 例如:a=123,b=“abc”
定义的变量可分为两类:局部变量和环境变量。
***局部变量***只在创建它们的shell中可用。
**环境变量即全局变量,则可以在创建它们的shell用。有些变量是用户创建的,其他的则是专用shell变量。使用export
、declare -x
来声明并设置环境变量,使用printenv
查看环境变量(只限制export设置环境变量的子shell能够引用,使用pstree
来查看父子进程图)使用变量: 变量前面跟
$
,例如:$a
或者${a}
只读变量: 定义变量前面加readonly
,只读变量是不能被改变的
删除变量: 将定义的变量删除unset
2、shell字符串
单引号字符串
单引号字符串:关闭转义功能,想要访问变量,必须使用单引号框起来,比如‘打印一个a变量 ‘$a’’
双引号字符串
双引号字符串:可以出现转义,访问变量可以双引号框起来,也可以使用大括号
字符串操作
${#string}:
获取字符串的长度
${string:0:4}
分割出0-4个字符(使用/bin/bash,不要使用/bin/sh)
$(expr index $string io)
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个)注意:$()
和反引号
作用一样
3、shell数组
数组定义 :数组名=(1 2 3 3 4)比如array=(”one“ ”two“ ”three“ ”four“)
${#array[*]}
或者${#array[@]}
获取数组的所有元素的个数
${#array[0]}
获取第一个元素的大小
4、shell注释
#
表示单行注释
:>>EOF
注释内容EOF
表示多行注释,其中EOF
可以为其它字符
5、echo和printf用法
echo
格式:echo 字符串
1、echo abc:打印abc,省略双引号
2、echo ”zhangsan“ 带双引号打印,跟-e:
表示开启转义。\c:
表示不换行,\d:
表示换行
3、echo $(指令)
4、echo ${变量}printf
格式:
printf ” %s %d %c %f“
字符串 整形 字符 浮点型
%s %c %d %f
都是格式替代符,%s
输出一个字符串,%d
整型输出,%c
输出一个字符,%f
输出实数,以小数形式输出。
实例:
1、%-8s
指一个宽度为 8个字符(-
表示左对齐,没有则表示右对齐)
2、%-4.2f
中的.
后面的指浮点型的位数
6、运算符
算数运算符
expr指令:
val= ( e x p r 1 + 1 ) 、 v a l = (expr 1 + 1) 、 val= (expr1+1)、val=(expr 1 \* 1 ) 运算符和数字中间需要使用空格隔开,其中*需要使用\转义 ,其它不需要转义
let指令:
let val=1+1 、let val++ 运算符和数字中间不能使用空格隔开,效率更高关系运算符
-eq
==
等于 、-gt
大于、-lt
小于、-ge
大于等于、-le
小于等于、-ne
!=
不等于
不支持字符串布尔运算符
-a
与 、-o
或 、!
非 。 如果使用[]、test
,都使用单个
逻辑运算符
&&
逻辑与 、||
逻辑或 。如果使用[]、test
,都使用双个
字符串运算符
=
等于 、!=
不等于 、-z
0长度字符串为true 、-n
不为0长度字符为true、$
string判断字符串是否为空,不为空返回真文件测试运算符
-e
判断文件或者目录是否存在,存在则为真
-s
判断文件是否为空,不为空则为真
-r
判断文件是否可读,可读则为真
-w
判断文件是否可写,可读则为写
-x
判断文件是否可执行,可读则为执行
-u
判断文件是否设置了UGID 位,是则为真
-g
判断文件是否设置了SGID 位,是则为真
-k
判断文件是否设置了粘着位,是则为真
-p
判断文件是否为有名管道文件,是则为真
-b
判断文件是否为块设备文件,是则为真
-c
判断文件是否为字符设备文件,是则为真
-d
判断文件是否为目录文件,是则为真
-f
判断文件是否为普通文件,是则为真
7、shell流程控制
if条件选择
if
条件(使用[]或者test进行判断)
then
内容
elif
条件
then
内容
else
fi
case条件选择
case
值in
值)
内容;;
值)
内容;;
esac
for循环
for val in value0 value1 value2 ...
do
内容
done
while循环
while
条件
do
内容
done
until循环
until
条件
do
内容
done
无限循环
for((;;))
或者while true
或者while :
do
内容
done
使用
break
可以跳出循环,使用continue
可以跳过这一轮循环
8、shell传递参数
$0
:脚本的名字
$1,$2,$3...
:脚本传递的第1,2,3参数
$#
:传递参数的个数
$*
:所有传递参数,聚合在一起的字符串
$@
:所有传递参数,分开的字符串
$$
:当前进程ID
$?
:后台运行的最后一个进程id
$!
:上一个执行退出的状态,可以是函数、指令等
$-
显示Shell使用的当前选项,与set命令功能相同。
read
val:将终端脚本后面的参数读入并赋值给val
9、shell函数
函数格式
: function 函数名() { 内容(使用参数同上$#
、$*
、$$
、$?
、$!
) }
函数调用
:函数名 函数参数
10、shell之间文件包含
.
、source
包含其它shell文件。