Shell是什么
Shell是一种易编写、易调试的解释型编程语言。<br /> Shell文件需要使用shell解释器进行解析,Shell解释器能够接收应用程序或者用户的命令,然后调用系统内核。
- 通过
cat /etc/shells可以查询Linux系统中有那些Shell解释器。 -
Shell脚本入门
Shell文件必须以
#!/bin/bash开头,用于指定脚本需要使用的解释器。- shell文件可以通过
sh 文件名执行,也可以通过chmod a+x 文件名给文件添加执行权限,然后执行执行文件。示例:打印hello world
创建文件helloWorld.sh
文件内容如下: ```shellvi helloWorld.sh
!/bin/bash
echo “Hello World”
通过`sh helloWorld.sh`可以执行脚本。> 注意:如果通过以下命令给`helloWorld.sh`添加权限,可以通过`./helloWorld.sh`执行文件。```shell# 给文件添加执行权限chmod a+x helloWorld.sh
示例:指定目录下创建文件
创建文件createFile.sh
vi createFile.sh
文件内容如下:
#!/bin/bash# 创建路径mkdir test# 进入test路径cd test# 创建HelloWorld.txt文件touch HelloWorld.txt# 添加内容到文件echo "Hello World" >> HelloWorld.txt
Shell中的变量
Shell中的变量分以下几种:
- 系统变量:操作系统已经定义的变量,我们可以直接使用
- 自定义变量:我们自己定义的变量,可以在我们的脚本文件中使用
Shell特殊变量:Shell提供了一些特殊的变量,可以方便我们在Shell脚本中使用。
系统变量
常见的系统变量有:
$HOME:当前用户的Home路径$PWD:当前的工作目录$SHELL:默认的Shell解析器$USER:当前用户
示例:
#!/bin/bash# 输出当前系统默认的Shell解析器echo $SHELL# 输出当前用户的Home路径echo $HOME# 输出当前用户echo $USER# 输出当前的工作目录echo $PWD
执行脚本后得到如下结果:
/bin/bash/home/chentiefengchentiefeng/home/chentiefeng/shell-demo/hello-world
自定义变量
- 定义变量:
变量名=值 - 撤销变量:
unset 变量名 - 声明静态变量:
readonly 变量名,注意:readonly定义的变量不支持unset。 - 声明全局变量:
export 变量名,全局变量可以供其他Shell程序使用注意:
- 变量名可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
- 变量赋值的
=两边不能有空格。 - 变量默认都是字符串类型,无法直接用于数值运算。
- 变量的值如果有空格,需要使用双引号或者单引号括起来。
Shell特殊变量
- $n:n为数字
$0:代表正在执行的文件名$1-$9:代表第一到第九个参数${10}:10以及10以上的参数,需要使用大括号包含,如${10}代表第10个参数
$#:获取所有输入参数的个数$*:代表所有的参数,$*把所有参数作为一个整体$@:也代表所有参数,$@把每个参数区分对待$?:返回上一次执行的命令的返回状态- 如果值为0,表明上一个命令正确执行
- 如果值不为0,表明上一个命令执行不正确
$_:保存之前执行的命令的最后一个参数$!:后台运行的最后一个进程的ID号-
运算符
基本语法:
$((运算式))或者$[运算式]expr +,-,\*,/,%:加,减,乘,除,取余
示例:(2+3)x 4
expr `expr 2 + 3` \* 4
或者:
tmp=$[(2+3)*4]echo $tmp
条件判断
基本语法:
[ condition ]
注意:条件condition非空即为true,即[]为false
两个整数判断
=:字符串比较-lt:小于(less than)-le:小于等于(less equal)-eq:等于(equal)-gt:大于(greater than)-ge:大于等于(greater equal)-ne:不等于(not equal)
示例:
[ 1 -eq 2 ]echo $? #1[ 1 -le 2 ]echo $? #0
文件权限判断
-r:读的权限(read)-w:写的权限(write)-x:执行的权限(execute)
示例:
touch test.txt[ -x test.txt ]echo $? #1
文件类型判断
-e:文件存在(existence)-f:文件存在并且是一个常规的文件(file)-d:文件存在并且是一个文件夹(directory)
示例:
touch test.txt[ -e test.sh ]echo $? #1[ -e test.txt ]echo $? #0
多条件判断
&&:前一条执行成功,才执行后一条||:前一条执行失败,才执行后一条
示例:
touch test.txt[ -e test.txt ] || [ -e test.sh ]echo $? #0[ -e test.txt ] && [ -e test.sh ]echo $? #1
流程控制
if 判断
基本语法:
if [ condition ];then# 逻辑fi
或者:
if [ condition ]then# 逻辑fi
示例:
#!/bin/bashif [ -f $1 ];thenecho '第一个参数是一个可执行文件'elif [ -d $1 ];thenecho '第一个参数是一个文件夹'fi
case语句
基本语法:
case $变量名 in"值1")//执行逻辑1;;"值2")//执行逻辑2;;*)//默认执行逻辑;;esac
示例:
#!/bin/bashcase $1 in1)echo "[1]input value is 1";;2)echo "[2]input value is 2";;*)echo "[*] input value is $1";;esac
for循环
基本语法1
for((初始值;循环控制条件;变量变化))do//执行逻辑done
示例:
#!/bin/bashsum=0for((i=1;i<=100;i++))dosum=$[$sum+$i]doneecho $sum
基本语法2
for 变量 in 值1 值2do//执行逻辑done
示例:打印所有输入的参数
#!/bin/bashfor i in $*doecho $idone
while循环
基本语法:
while [ 条件判断式 ]do// 执行逻辑done
示例:
#!/bin/bashsum=0i=1while [ $i -le 100 ]dosum=$[$sum+$i]i=$[$i+1]doneecho $sum
read读取控制台输入
基本语法:
read(选项)(参数)
选项:
-p:指定读取值时的提示符-t:指定读取值时等待的时间(秒)
参数:
- 变量:指定读取值的变量名
示例;在10秒内输入用户名
#/bin/bashread -t 10 -p "Please input your username: " usernameecho $username
函数
系统函数
basename
描述:basename会删除所有的前缀包括最后一个(/)字符,然后将字符串显示出来。
基本语法:
basename [string/pathname][suffix]
选项:
- suffix为后缀,如果指定了suffix,basename会将pathname或string中的suffix去掉
示例:取出文件名
$ basename $pwd/009read.sh009read.sh
