目录
shell
shell本身就是C语言编写的程序,是用户去操作linxu/Unix的桥梁,用户的很多操作都是通过shell完成的。shell既是一种命令语言,也是一种编程语言。
shell执行的方式
-
交互式
-
解释执行用户的命令,用户输入一行命令就执行一行。
-
-
批处理(Batch)
-
用户先写一个shell脚本,可以把很多的命令都放到这个脚本中。可以去执行这个脚本文件,从而一次性的执行这个脚本文件中的所有命令。
-
在linux/Unix上,shell的解释器有很多,常见的有:bash、sh、csh、ksh,我们常说的“多种shell”其实是指的多种shell解释器。
-
bash:是linux上默认的解释器。内部的命令有40个。
-
sh:是Unix上默认的解释器。
bash是完全兼sh的
1. 创建第一个shell脚本
-
创建一个文件即可,这个文件最好用.sh作为结尾
-
在文本的第一行写入:#!/bin/bash
-
这句话的含义是:告诉系统,使用哪个解释器来解释这个脚本
-
-
保存这个文本即可
vi first.sh
2.执行脚本
-
输入脚本的绝对路径或者相对路径
-
使用这种方式执行shell,需要给脚本添加 x权限
-
-
使用bash或者sh命令(无需x权限)
-
使用 . 执行
. first.sh
-
使用source命令
注意: 以上方式在执行脚本的时候是有区别的:
bash、sh命令,会创建一个新的bash,并且在新的bash中执行脚本。和当前bash没有变量共享。
. 执行脚本的时候,会在当前的bash执行,可以共享到当前bash中的变量。
3.变量
3.1 shell中变量的设置规则
-
变量可以由字母,数字,下划线组成,数字不能作为开头。
-
在bash中变量的类型只有一个,就是字符串
-
变量的赋值用 = 赋值,=左右两侧不能有空格
-
如果变量的值需要包含空格,则这个值需要用' '或者“ ”括起来
3.2 变量的分类
可以分为 用户自定义变量、系统变量、位置参数变量 和 预定义变量。可以使用set
指令查看当前系统中所有的变量,可以使用unset
指令撤销一个变量。
系统变量:存储系统环境相关的变量,例如:PATH、PWD、USER、
位置参数变量:主要用于存储执行脚本的时候传递的参数。
预定义变量:是bash中已经定义好的变量,有着特殊含义
3.3 设置变量
定义:习惯上来说,我们用大写字母定义变量
使用:使用 $
·取出指定变量的值
3.4 变量的赋值
3.4.1 在定义的同时用一个字母进行赋值
NAME=xiaoming
echo $NAME
3.4.2 将一个命令的输出结果给一个变量赋值
COM=`ls -l` #执行一次ls并将得到的结果赋值给COM变量
COM=$(ls -l) #等价于上面的方式
COM=$((4+5)) #将两个数字的运算结果给一个变量
COM= `expr 4 + 5` #将两个数字进行四则运算的结果给一个变量赋值
#运算符两侧需要有空格
#在expr运算中,*是需要转义的
3.4.3 将一个变量的值给另外一个变量进行赋值
COM=$PATH
3.5变量的叠加
将一个变量的值和另外一个变量的值进行拼接组合。
A=123
B="$A"456
echo $B #得出123456
B=$A/456
echo $B #得到123/456
B=${A}456 #123456
单引号与双引号的区别:
单引号中的内容会原义输出,不会进行任何变量解析。
双引号中的变量,会自动的解析成变量的值。
3.6 readonly
可以将一个变量做成只读,只读的变量不能修改值。
只读变量不能删除。
3.7 环境变量
环境变量是变量的一种,用户自定义的变量只在当前的shell中生效,环境变量可以在当前shell以及子shell中生效,如果将一个环境变量写入配置文件,则在所有的shell中都可以生效。
export 变量名=值 #定义了一个环境变量
# /etc/profile
3.8位置参数变量
可以去捕获执行脚本的时候,传入的参数。
位置参数不能自定义名字,只能用特定的符号来表示。
$0:代表脚本本身
$1-9:顺序获取第1个到第9个参数
$(10):获取第10个参数
$*:获取参数列表中所有参数,将所有的参数视为一个整体,以“1 2 3 4 ... n”形式输出
$@:获取参列表中的所有参数,把每个参数区分对待,以“1”,“2”,“3”,“4”..."n"形式输出。
4.read命令
read是一个输入指令,可以将用户的输入给一个变量进行赋值
read NAME # 将从控制台输入的内容给NAME赋值
-p:一个输入时候的提示语句
-s:隐藏输入,不显示输入的信息,常见于密码
-n:限制输入的位置
5.数组
bash仅支持一维数组,并且没有限制数组的大小
5.1 定义数组
数组在shell中,使用()来定义,小括号中填充数组中的元素,元素之间以空格来区分。
ARRAY=(10 20 30 hello world 0)
5.2 数组中的元素访问
也是通过下标访问,下标也是从0开始
与Java不同,如果访问到一个不存在的下标,程序不会出错,只是得到一个空值。
可以通过${ARRAY[0]}
获取数组ARRAY中的第0个元素
可以通过${ARRAY[@]}
或者${ARRAY[*]}
获取数组ARRAY中的全部元素
可以通过${#ARRAY[@]}
获取${#ARRAY[*]}
获取数组的长度
5.3 数组遍历
for 变量 in ${ARRAY[@/*]}
do
xxxx
done
6.条件控制
6.1关系运算符
仅支持数字进行关系判断
> :-gt
< :lt
== :-eq
!= :-ne
>= :-ge
<= :-le
[ $A -eq $B ] :判断两个变量的值是否相同
6.2 逻辑运算符
&& :-a
|| :-o
! :!
6.3字符串判断
= :判断两个字符串是否相同
!= :判断两个字符串是否不同
-z :检测字符串长度是否为0
if [ -z "" ]
echo "为0“
fi
-n :检测字符串长度是否不为0
直接用字符串判断 :检测字符串是否为空
6.4文件判断
-d : 检测目标路径是否是一个目录
-f : 检测目标路径是否是一个文件
-e : 检测目标路径是否存在
-r : 检测一个文件是否可读
-w : 检测一个文件是否可写
-x : 检测一个文件是否可执行
-s : 检测一个文件是否为空(大小为0)
7.流程控制
7.1 if
if [ 条件 ]
then
xxx
fi
if [ $1 -ge 0 ] #$1表示第一个参数
then
echo "这是一个正数"
fi
echo 程序结束
if [ $1 -ge 0]; then echo "这是一个正数"; fi
#若写在一行,语句后要加分号
if [ $NUM1 -gt $NUM2]
then
echo "$NUM1 大于 $NUM2 "
elif [ $NUM1 -lt $NUM2]
echo "$NUM1 小于 $NUM2"
else
echo "$NUM1 等于 $NUM2"
fi
7.2 case
case 变量 in
value1)
xxx
;;
value2)
;;
*)
esac
case $1 in
1)
echo 春天
2)
echo 夏天
3)
echo 秋天
4)
echo 冬天
*)
echo 不存在
esac
7.3 for
for 变量 in 集合
do
xxx
done
for i in {5..50}
do
echo $i
done
7.4 while
i=1
while [ $i -ls 10]
do
echo $i
i= `exp $i + 1`
done
7.5 until
和while逻辑一样,和while的区别是:
util后面的条件如果成立则循环停止,如果不成立,循环继续
8.方法
在方法中:
$1 :获取第一个参数
$* :获取所有参数
$# :获取参数的数量
$? :获取上一次执行方法的返回值
在shell中,方法的定义必须放在前面
function test(){
echo "hello world"
}
test
function test1(){
sum=`expr $1 + $2`
return $sum
}
test1 10 20
function test2(){
return
}