1:Shell
Shell:
用户通过Shell与操作系统通信,而依赖于硬件操作是由内核管理的。Linux系统的Shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言。Linux系统的很多服务都是通过Shell脚本来启动,通过查看脚本,可以了解服务的启动过程,从而为故障诊断和系统优化做好准备。
- 它是命令语言、命令解释程序及程序设计语言的统称。每种操作系统都有其特定的Shell ,现在流行的有Bourne Shell(简称sh)、Korn Shell(简称ksh)、C-Shell(简称csh)。
Linux的缺省Shell是Bash(Bourne Again shell) 。- 查看Shell解释器bash的版本执行的命令为:bash –version,或打印环境变量BASH_VERSION的值来获得版本号。
- 用户在提示符下输入的命令都由Shell先解释然后传给Linux核心。
Shell功能:
- 命令解释器:shell接受用户输入的命令,进行分析,创建子进程,由子进程实现命令所规定的功能,等子进程终止后,发出提示符。
- 高级程序设计语言:shell具有编程功能,包括变量定义、系统关键字、各种逻辑控制语句等,而且还拥有自己的语法结构,是一套功能完善的程序设计系统。
Shell脚本执行的两种方式:
- sh+文件名执行
- chmod a+x 文件名 ./文件名执行
如果用户想让编写的Shell脚本像Shell提供的命令一样(直接输入命令)为每个用户使用,也就是开发出系统的新命令,可以在编写好的脚本上为所有用户加上执行权限后,将其放在命令搜索路径的目录之下(通常是/bin或/usr/bin等),这样就像普通命令一样进行使用。
2:Shell变量
Shell变量的名字可以由数字、字母和下划线组成。在Bash中,Shell变量的值总是字符串,变量的值没有长度限制。
Shell变量类型:
使用变量: $变量名
- 环境变量
- 用户变量
A=100
echo A=$A
unset A #撤销变量A
echo A=$A
readonly B=20 #静态变量不可撤销
echo B=$B
#####输出#####
A=100
A=
B=20
- $$(当前进程PID)
- $!(后台运行的最后一个进程PID)
- $?(最后一次执行的命令的返回状态,如果变量值为0证明上一个命令正确执行,如果非0则上一个命令不正确)
3:位置参数
- 执行Shell脚本时,如果希望获取到命令行参数信息,就可以使用到位置参数变量。
- $n(n为数字,0表示命令本身1/9代表第一到第九个参数,十以上的参数需要用大括号包含0表示命令本身 1/9代表第一到第九个参数,十以上的参数需要用大括号包含0表示命令本身1/9代表第一到第九个参数,十以上的参数需要用大括号包含{10})
- $*(变量代表命令行中所有的参数,将所有的参数看作一个整体)
- @(变量代表命令行中所有的参数,不过@(变量代表命令行中所有的参数,不过@(变量代表命令行中所有的参数,不过@将每一个参数区别对待)
- $#(变量代表命令行中所有参数个数,不包含命令本身)
echo "命令本身为$0"
echo "参数1=$1 ,参数2=$2"
echo "所有参数为$*"
echo "所有参数为$@"
echo "参数个数为$#"
####执行####
[root@centos7 home]# sh test.sh 1 2
位置参数0号为命令本身=test.sh
位置参数1号=1
位置参数2号=2
位置参数整体(将所有的参数作为一个整体)=1 2
位置参数整体(区别对待每一个参数)=1 2
参数个数为=2 #不包含$0
####可以使用set设置位置参数####
set 1 2 3
echo $1 $2 $3
####执行####
1 2 3
####shift可以移动位置####
shift 2
echo $1
如果参数为1 2 3 4则echo $1输出3
4:数学运算
#! /bin/bash
set 1 2 3
echo $1 $2 $3
expr 1 + $1 #1+1
expr 2 \* $2 #2*2
expr 3 - $3 #3-3
expr 2 / $1 #2÷1
expr 2 % $1 #2取余1
RESULT=`1 + 1` #将计算结果赋予RESULT
5:通配符
通配符 | 说明 |
---|---|
* | 匹配任意多个字符串,在搜索文件时使用 |
? | 匹配任意一个字符 |
[ list] | 匹配该字符组所限定的任何一个字符 |
[!list] | 匹配除了字符组所限定的任何一个字符 |
[c1-c2] | 匹配c1-c2中的任何一个字符 |
6:转义字符
转义字符 | 说明 |
---|---|
’ ’ 单引号 | 由单引号括起来的所有字符或字符串都作为普通字 符出现。 |
" "双引号 | 由双引号括起来的字符,除$、倒引号和反斜线(\)仍保留其特殊功能外,其余字符都作为普通字符。 |
``反引号 | 如果想将计算结果为某个变量赋值 需要 ``反引号括起来 |
# | 注释符 |
\ | 转义符,它能把特殊字符变成普通字符若想在字符串中使用反斜杠本身,必须采用两个\的形式 |
& | 后台操作符 |
7:控制语句
test语句:
test expression 或 [ expression ]
-a file 若文件file存在,则条件测试为真,返回结果为0
-b file 若文件file存在,且为块文件,则条件测试为真,返回结果为0
-c file 若文件file存在,且为字符文件,则条件测试为真,返回结果为0
-d file 若文件file存在,且为目录文件,则条件测试为真,返回结果为0
-e file 若文件file存在,则条件测试为真,返回结果为0
-f file 若文件file存在,且为常规文件,则条件测试为真,返回结果为0
-r file 若文件file存在并且可读,则条件测试为真,返回结果为0
-w file 若文件file存在并且可写,则条件测试为真,返回结果为0
-x file 若文件file存在并且可执行,则条件测试为真,返回结果为0
-p file 若文件file存在并且是FIFO文件,则条件测试为真,返回结果为0
-s file 若文件file存在并且不是空文件,则条件测试为真,返回结果为0
if语句:
#if else
if [ 条件表达式 ]
then 满足则执行该语句
else 不满足执行该语句
fi
#if elseif else
if [ 条件表达式1 ]
then 满足表达式1
elif [ 条件表达式2 ]
then 满足表达式2
else [ 都不满足 ]
fi
select语句:
#! /bin/bash
select var in "a" "b" "c"
do
echo "你的回答是$var"
break
done
#执行
[root@centos7 home]# sh test.sh
1) a
2) b
3) c
#? 3
你的回答是c
case语句:
#!/bin/bash
read NUM
case $NUM in
"1")
echo "周一" ;;
"2")
echo "周二" ;;
"3")
echo "周三" ;;
"4")
echo "周四" ;;
"5")
echo "周五" ;;
"6")
echo "周六" ;;
"7")
echo "周天" ;;
*)
echo "星期八" ;;
esac
case $1 in
[Dd]ate) echo the date is `date` ;; #如果输入Date 或者 date
dir|path) echo the path is `pwd`;; #如果输入dir 或者 path
*) echo bye
esac
for语句:
#带参数列表的for循环 找出当前文件下所有的.c文件并输出内存
for i in *.c
do
cat $i
done
#不带参数列别的for循环 从1加到100
#! /bin/bash
SUM=0
for((i=1 ; i < 100 ; i++))
do
SUM=$[$SUM + $i]
done
echo $SUM
while语句:
#! /bin/bash
SUM=0
i=0
while [ true ]
do
SUM=$[$SUM + $i ]
i=$[ $i + 1]
if [ $i -eq 100 ] #当i=100跳出循环
then break
fi
done
echo $SUM
break语句:
break n n表示几层循环 默认1层
continue语句:
continue n continue命令后面的整数n表示要提出n层循环,默认值为1。
exit语句:
exit [n] 其中n为设定的退出值,如果未给定n的值,则退出值为最后一个命令的执行状态
函数:
Function( )
{
command-list
}
Function 调用