shell的意思是:壳,作为操作系统内核的外壳。
在Linux系统下,用户不能直接操作内核,而是通过shell来操作内核的,简单说shell就是内置了Linux指令的脚本文件。
一、shell变量
1、变量分类
(1)本地变量:
简单说就是某一个shell脚本中自己定义的变量,只能在该脚本中使用。
(2)环境变量:
说明:
相对于整个操作系统而言的变量,类似window的环境变量。一旦配置在整个操作系统的任意位置都能查看和使用。
使用:
查看所有的环境变量:终端直接输入env回车即可
查看指定的环境变量:echo $变量名
比如:
查看PATH环境变量:echo $PATH
(3)配置环境变量:一般都是针对文件
方法一:export PATH=$PATH:文件目录
方法二:PATH=$PATH:文件目录
可以给安装的软件配置环境变量,使用起来会比较方便
$PATH:获取当前PATH环境变量的值,目的是为了在不改变之前的配置的情况下在其后进行追加
注意:在windows下环境变量是用分号隔开的,在Linux中用的是冒号。以上两种方法直接在终端配置是一次性配置,想要永久生效需要在配置文件中进行配置,不同的发行版配置文件名称不一致。
(4)Ubuntu:
系统配置文件:/etc/profile
用户配置文件:~/.profile或者~/.bashrc或者~/.bash_profile
其实系统配置文件中有指定用户配置文件,不确定配置那个用户配置文件可以按系统配置文件中指定的来(最好)。将以上两种方法按自己需求写到系统配置文件或者用户配置文件任意一个中即可。
注意:系统配置文件需要重启系统,用户配置文件需要重启终端。不想重启也可以直接在终端输入:source 配置文件
系统配置文件和用户配置文件的区别:
很明显一个是针对整个系统一个是针对某个用户,即:作用范围不同。可以根据自己需求进行配置
2、变量的使用和定义
注意:要在后缀为.sh的shell脚本文件中
定义:a=值
比如:username=‘张三’
注意:变量定义等号两边一定不能有空格
打印变量:echo $变量名
比如:echo $a或者echo ${a}
注意:shell脚本中变量的值要通过$获取,第二种可以用来做字符串的拼接,将变量和字符串进行拼接
销毁变量:unset 变量名
比如:unset a
声明常量:readonly username='张三'
注意:只读常量不可修改
二、数据类型
1、字符串类型
(1)字符串定义
单引号:单引号中的字符串以原样输出。
双引号:双引号中的字符串如果带有特殊字符会被解析
特殊字符:$、*、&、|、``、^、\等
反引号``:会被当作命令来执行
比如:echo `date`
(2)字符串的使用
获取字符串长度:${#变量名}
类似切片获取字符:${变量名:下标:个数}
比如从字符串a的下标2开始获取2个字符:${a:2:2}
2、数组类型
定义:a=(1 2 3)
获取:${a[下标]}
个数统计:${#a[@]}
所有元素:${a[*]}
注意:需要配合echo才能显示数据,echo是标准输出的关键字
seq:生成一个指定的连续整数的队列
比如生成2到10的连续整数:seq 2 10
expr:express表达式的缩写,很明显就是用来执行表达式的
比如:
expr 2 + 3 加法运算
echo `expr 3 + 5`
expr 3 \* 5 *号需要转义
注意:数字和运算符之间一定要有空格,否则会被当成字符串
三、运算符
1、数值运算符
-lt:小于
-le:小于等于
-gt:大于
-ge:大于等于
-eq:等于
-ne:不等于
2、字符串判断
=:等于
!=:不等于
-z:字符串的长度为0
-n:字符串长度不为0
3文件判断
-f:是否是普通文件
-b:是否是块设备文件
-c:是否是字符文件
-d:是否是目录文件
-w:是否可写
-x:是否可执行
-s:是否存在
4、逻辑运算
-a:逻辑与
-o:逻辑或
!:逻辑非
&&:逻辑与
||:逻辑或
-a和&&的区别:-a连接一个范围中的多个表达式,&&用来连接多个范围的不同表达式
-o和||的区别:同上,简单说就是&&和||不能写在范围[]中,同样-a和-o不能写在范围外
比如:
if [ 1 -lt 0 ] || [ 1 -lt 2 -o 2 -lt 3 -a 4 -gt 3 ];then
echo '逻辑或:||'
fi
四、分支结构
1、if-elif-else:
#方式一
if test 1 -lt 2;then
echo '1<2'
fi
#方式二,注意[]前后必须要有空格
if [ 3 -gt 2 ];then
echo '3>2'
fi
if [ 2 -eq 2 ];then
echo '='
fi
if [ 2=2 ];then
echo '-eq'
fi
注意:其中if和elif是一个范围,elif和else或elif是一个范围,最后else和fi是一个范围。
2、case:
read -p '请输入一个字符:' ch
case $ch in
[0-9])
echo '你输入了一个数字'
;;
[a-z])
echo '你输入了一个字母'
;;
*)
echo '你输入了一个非字母和数字的字符'
;;
esac
read -p:用来在终端提醒输入的。
[0-9]:数字0到9
[a-z]:字母a到z和字母A到Z
*):代表其他
;;:小范围
esac:大范围,case的倒写
注意:格式固定,其中判断条件也可以这样[0-9a-z],类似正则表达式,其他没测。
五、循环结构
1、for-in
#第一种
for x in ${a[*]}
do
echo 数据:${x}
done
#第二种
for x in `eq 10`
do
echo 数据:${x}
done
do和done:代码的范围
2、for循环和continue、break的使用
for ((i=0;i<${#a[@]};i++))
do
if [ $i -eq 1 ];then
echo '下标到1停止本次循环'
continue
elif [ $i -eq 3 ];then
echo '下标到3停止向下循环'
break
fi
echo 下标为$i的数据:${a[$i]}
done
3、while
#方式一
i=0
sum=0
while [ $i -lt 5 ]
do
((sum+=i))
((i++))
echo $sum
done
#方式二
j=0
sum2=0
while [ $j -lt 3 ]
do
let sum2+=j
let j++
echo $sum2
done
#方式三
x=0
sum=0
while [ $x -lt 3 ]
do
sum=$[$sum+$x]
x=$[$x+1]
echo $sum
done
4、until:条件成立结束循环
i=0
until [ $i -gt 3 ]
do
echo $i
((i++))
done
六、函数使用
#函数的使用
demo(){
echo $1
return 150
}
#向文件传值
echo $1
#向函数传值
demo 1
#返回值,这个有点不稳定或者说不太好用
echo $?
$0:获取文件名
$1:获取第一个参数,其他数值依此类推,比如$2、$3等
$*:获取所有的参数
$#:参数的个数
$?:在终端是上一次命令执行的情况,0:代表成功,其他数字:代表失败;在函数中可以用来获取返回值
函数调用:方法名 参数