1 什么是shell
shell是以.sh结尾文件的命令行解析器,命令ls -> shell -> kernel ->硬件层,shell脚本是一堆有序的命令集合及特有的语法。(简单来说就是将命令写入.sh文件,执行文件即会执行命令)
2 脚本的实例
2.1 shell脚本执行
执行脚本三种方法:
./01test.sh :一般创建.sh文件时系统不会给用户可执行权限(x),需要用户手动开启(chmod 0777 01test.sh或者 chmod u+x 01test.sh )
bash 01test.sh :可直接执行文件
source 01test.sh :可直接执行文件
注:./ 与 bash 方式执行会新开子终端执行,将结果传回当前终端,source 直接在当前终端执行。
2.2 shell脚本变量的使用
2.2.1 变量的定义与赋值
在shell中变量不需要定义,默认赋的值为字符串,可以直接使用。
赋值运算符 ' = ' 前后不能够有空格
获取变量值的方式:$变量名 或者 ${变量名}
#!/bin/bash #不是注释,代表解析当前脚本使用的是/bin/bash命令行解析器
var1=123 #默认是字符串
var2='abc def' #有空格时添加单引号
var3="def $var2" #当赋值中需要获取变量结果,添加双引号
echo "abcd $var3"
2.2.2 shell中位置变量的使用
在shell中使用命令行传参,在脚本中获取参数的变量就是位置变量:./01test.sh 11 22 33
$0:脚本名字
$1:11
$2:22
$3:33
${n} :获取第n个位置参数
$#:命令行参数个数,不含脚本名
$@或$*:命令行所有参数,不包含脚本名
2.2.3 命令置换
将一个命令结构赋值给另一个变量
` 命令 `或 $( )
#!/bin/bash
var1=`ls`
echo $var1
var2=$(echo $var1) #将echo执行的结果赋值给var2变量
echo $var2
2.2.4 环境变量
获取环境变量快捷命令:env
echo $PATH
echo $HOME
echo $PWD
echo $USER
注:如果要修改PATH环境变量,在/etc/environment 中添加自己的绝对路径
但必须通过 source /etc/environment 来更新路径,否则不生效
./a.out 消去 ./ 方法:
方法一:将文件中a.out的绝对路径添加到PATH中,再用 source /etc/environment 来更新路径
方法二:将a.out添加到sudo mv a.out /usr/bin中
2.3 shell中数组的使用
shell中只有一维数组;
arr=(11 22 33) 不需要写成员个数,成员之间空格隔开;
获取数组中成员:${arr[下标]}
获取数组中所有成员: ${arr[@]}或${arr[*]}
获取数组中成员个数:${#arr[@]}或${#arr[*]}
获取某个成员的长度:${#arr[下标]}
数组默认下标依次递增:arr=(11 22 [3]=444 555) #数组跳过arr[2],赋值了arr[3]和arr[4]
数组追加:arr=(${arr[@]} 55) #获取源数组成员,附加了55,重新赋值给arr
案例:
#!/bin/bash
arr=(`ls`) #将ls的结果放在了arr数组中
echo ${arr[0]}
echo ${arr[1]}
echo ${#arr[*]} #获取当前目录下文件的个数
echo ${arr[*]} #打印数组中所有的成员
2.4 shell的输入输出
read输入:
read -p "文本" 变量名
read -a 数组名 :从终端输入字符串到数组
read -s 变量名 :输入的时候不回显
read -n 3 变量名 :当输入字符到达3个时自动结束输入
read -t 秒钟 变量 :指定时间输入
echo输出:
echo $变量名1 $变量名2 $变量名n
echo -n "hello world" : -n 取消换行
echo -n -e "hello world\n" :解析转义字符
在shell脚本中可以精细化输出:
printf "%d-%02d-%02d %02d:%02d:%02d\n" $year $month $day $hour $min $sec
2.5 shell的算数运算
2.5.1 (()) 进行算数运算
(( 支持C的算数运算 ))
#!/bin/bash
var1=123
var2=456
((sum = var1 + var2 )) #将var1和var2的结果赋值给sum,支持c语法规则
echo $sum
((sum=$var1+$var2))
echo $sum
sum=$((var1+var2)) #表示将var1和var2的结果通过$符号取出赋值给sum变量
echo $sum
mul=$((3 * 4))
echo $mul
mul=$((3 ** 4)) #shell中增加了幂运算,表示3^4=81
echo $mul
2.5.2 $[] 进行算数运算
#!/bin/bash
var1=11
var2=22
sum=$[var1+var2]
echo $sum
sum=$[$var1+$var2]
echo $sum
mul=$[3 ** 4]
echo $mul
n=1
n=$[++n]
echo $n
2.5.3 expr 进行算数运算
#!/bin/bash
var1=11
var2=22
expr $var1 + $var2
#在使用expr进行算术运算的时候变量前必须使用$
#运算符前后必须加空格,expr自带向终端输出结果的功能
sum=`expr $var1 + $var2`
echo $sum
#如果要将expr的结果赋值给sum变量必须使用命令置换符
expr 3 \* 4
#如果要使用expr进行乘运算的时候,必须使用转移字符,
#否则认为*是通配符
#expr 3 \*\* 4
#expr不能够进行幂运算
2.5.4 expr虽然运算效率最低,但expr可以操作字符串
#!/bin/bash
#expr match STRING REGEXP
string=www.hqyj.com11
expr match $string "www.h"
#拿后面的字符在string中比如,返回的是匹配上的子字符串的长度
#在匹配的时候如果有任何一个不相等返回的就是0
#expr substr STRING POS LENGTH
expr substr $string 2 5
#从string的第二个字符开始提起,提取5个字符
#expr index STRING CHARS
expr index $string '.'
#获取.在字符串string第一次出现的下标位置
#expr length STRING
expr length $string
echo ${#string}
2.5.5 案例
向程序输入任意一个文件,将文件名和文件后缀提取出来,分别打印到终端上
#!/bin/bash
read -p "input filename > " file
pos=`expr index $file '.'`
len=`expr length $file`
filename=`expr substr $file 1 $((pos-1))`
filetype=`expr substr $file $pos $len `
echo "filename = $filename"
echo "filetype = $filetype"