文章目录
1 概念
- Shell是一种用c语言编写的程序,它是用户使用linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。
- Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
2 Shell脚本(Shell Script)
- 是一种为shell编写的脚本程序。
- shell通常都是指shell脚本。
- shell和shell script是两个不同的概念。
- ”shell编程“都是指shell脚本编程,不是指开发shell自身。
3 shell环境
- Shell编程跟java、PHP编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以。
- Linux的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)
4 Shell的编写流程
- 编写Shell脚本
- 赋予可执行权限
- 执行,调试
5 运行Shell的两种方法
- 作为可执行程序
- chmod +x ./test.sh (u、g、o都是可执行权限)
shell高亮显示
[hr@yr ~]$ vi hello.sh
#!/bin/bash
# #!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,使用哪一种shell
echo "hello world!"
~
- 执行的方法:
- sh ./【shell】
- ./【shell】
- sh 【shell】等同于. 【shell】
[hr@yr ~]$ ./hello.sh
hello world!
[hr@yr ~]$ sh ./hello.sh
hello world!
[hr@yr ~]$ sh hello.sh
hello world!
[hr@yr ~]$ chmod -x hello.sh
[hr@yr ~]$ ll hello.sh
-rw-r--r-- 1 hr HR 32 Jan 17 11:24 hello.sh
[hr@yr ~]$ sh hello.sh
hello world!
[hr@yr ~]$ sh ./hello.sh
hello world!
[hr@yr ~]$ ./hello.sh
-bash: ./hello.sh: Permission denied # 没有权限
6 Shell常用关键字
- echo 打印文字到屏幕
- exec 执行另一个Shell脚本(在一个脚本里执行另一个脚本,调用的关系)
- read 读标准输入
- expr 对整数型变量进行算术运算
- test 用于测试变量是否相等、是否为空、文件类型等
- exit 退出
7 Shell的变量
注意:1)等号前后不要有空格:NUM=10
2)一般变量名用大写:M=1
3)使用$调用变量:$NUM
echo $NUM
1.用户自定义变量
- unset 删除变量
- readonly 标记为只读变量
- export 指定全局变量
2.预定义变量 - $0:脚本文件名
- $1-9:第1-9个命令行参数名
-
$#:命令行参数个数
-
$@:所有命令行参数
-
$*:所有命令行参数
输出所有的参数 -
$?:前一个命令的退出状态,可用于获取函数返回值
-
$$:执行的进程ID
显示进程号
3.环境变量
环境变量默认就存在,常见的有HOME、PATH、TERM、UID、PWD等
8 bash中整数运算符号
- + - * / 加减乘除
- % 余数
- $ 与
- | 或
- ! 非
9 Shell运算
m=`expr $m + 1` 加号左右要打空格
let m=$m+1 也可以
10 整数比较
- -eq 等于,如:if [ “$a” -eq “$b” ]
- -ne 不等于,如:if [ “$a” -ne “$b” ]
- -gt 大于,如:if [ “$a” -gt “$b” ]
- -ge 大于等于,如:if [ “$a” -ge “$b” ]
- -lt 小于,如:if [ “$a” -lt “$b” ]
- -le 小于等于,如:if [ “$a” -le “$b” ]
- < 小于(需要双括号),如:(("$a" < “$b”))
- <= 小于等于(需要双括号),如:(("$a" <= “$b”))
- > 大于(需要双括号),如:(("$a" > “$b”))
- >= 大于等于(需要双括号),如:(("$a" >= “$b”))
11 字符串比较
- = 等于,如:if [ “$a” = “$b” ]
- == 等于,如:if [ “$a” == “$b” ],与=等价
注意:
$a=1 变量a被赋予的值是数字1
$a==1 比较变量a的值是否为数字1
12 字符串比较
= 等于,如if[ “$a” = “$b” ]
== 等于,如if[ “$a” = “$b” ]
- 比较a和b的大小:
[root@yr d01]# vi true.sh
#!bin/bash
a=10
b=20
if [ $a == $b ]
then
echo "a=b"
else
echo "a!=b"
fi
~
"true.sh" 11L, 78C written
[root@yr d01]# . true.sh
a!=b
另一种写法:
[root@yr d01]# vi true2.sh
#!/bin/bash
a=10
b=20
if [ $a == $b ]
then
echo "a=b"
fi
if [ $a != $b ]
then
echo "a!=b"
fi
~
"true2.sh" 13L, 120C written
[root@yr d01]# . true2.sh
a!=b
- read -p p是prompt的缩写,从键盘输入的值获取变量值
- -t 三秒后
[root@yr d01]# vi read.sh
#!/bin/bash
read -t 3 -p "print:" x
if [ $x == 5 ]
then
echo "x is 5"
else
echo "x is not 5"
fi
~
~
"read.sh" 11L, 102C written
[root@yr d01]# . read.sh
print:3
x is not 5
13 循环
13.1 for循环
循环到取值范围结束才结束。是把变量一个一个取出来。
- 语法:
for i in {变量}
do
。。。
done
[root@yr d01]# vi for.sh
#!/bin/bash
for i in {1..10}
do
echo $i
done
~
"for.sh" [New] 7L, 48C written
[root@yr d01]# . for.sh
1
2
3
4
5
6
7
8
9
10
13.2 while循环
与for循环的区别:有判断
i=1
while (( $i<10 ))
do # do前面有空格,如果符合while就执行do后面,不符合就执行done
echo $i
i=$(($i+1))
done
13.3 嵌套
i=1
while(($i<10))
do
echo $i
i=$(($i+1))
if [ "$i" -eq 10 ]
then
echo $i
#else
# echo "false"
fi
done
或
i=1
while(($i<10))
do
echo $i
i=$(($i+1))
if(($i==10))
then
echo $i
#else
# echo "false"
fi
done
(())可以一个空格都没有,用== 、>=显示
[]必须再if 后加空格,所有地方都得有空格:if空格[空格变量空格-eq空格变量空格],并且用-eq等显示
14 数组
- 数组是有序的元素序列
- name】若将有限个类型相同的变量的集合命名,那么这个名称为数组名
- 组成数组的各个变量成为数组的分量,也成为数组的元素
[root@yr d01]# vi days.sh
#!/bin/bash
x=1
echo $x
days=([0]=Sun [1]=Mon [2]=Tue [3]=Wed [4]=Thu [5]=Fri [6]=Sat)
echo ${days[$x]}
echo ${days[4]}
echo ${days[5]}
echo "********************"
for i in {0..6}
do
echo ${days[$i]}
done
~
"days.sh" 15L, 208C written
[root@yr d01]# . days.sh
1
Mon
Thu
Fri
********************
Sun
Mon
Tue
Wed
Thu
Fri
Sat
说明:
如果不分行写,写在一行的话,
x=3 echo $x
定义一个x,x的值就按新定义的返回。
[root@yr d01]# export x=1
[root@yr d01]# . days.sh
1
Mon
但如果
x=3 ; echo $x
就相当于分行了。