shell是解释执行用户的命令,用户输入一条命令,shell进行解释执行,这种方式成为交互式。同样shell还有一种执行命令方式为批处理方式(Batch),用户事先写一个shell脚本(Script),其中有多条命令,让shell一次把这些命令执行完,而不必一条一条的敲命令。shell是解释执行,不需要编译,shell程序从脚本中一行一行读取并执行这些命令。
二、基本语法 1. 学习大纲 数据类型:字符串String 变量 全局变量—>环境变量 局部变量—>本地变量 VAR=10 控制语句:if、else、switch、case、for、while…… 函数 框架 2. 变量shell变量通常有字母加下划线开头,由任意长度的字母、数字、下划线组成
2.1 环境变量环境变量可以从父进程传给子进程,因此shell进程的环境变量可以从当前shell进程传给fork出来的子进程。使用printenv命令可以显示当前shell进程的环境变量
2.2 本地变量只存在于当前shell,使用set命令可以显示当前shell进程中定义的所有变量(包括本地变量和环境变量)和函数,一个变量定以后仅存在于当前shell进程,使用export命令可以把本地变量导出为环境变量
使用通配符匹配字符串
*、匹配0个或多个任意字符串 ?、匹配一个任意字符 [若干字符串]、匹配括号中出现的任意一个字符由" ` "反引号括起来的也是一条命令,shell先执行该命令,然后将输出结果立刻代换到当前命令行中。
使用(()),用于算数运算,(())中的变量取值将转换为整数,(()),用于算数运算,(())中的变量取值将转换为整数,(()),用于算数运算,(())中的变量取值将转换为整数,[]与它等价
$(())中只能用±*/和()运算符,并且只能做整数运算
$[base#n],其中base表示进制,n按照base进行解释,后面再跟运算数,按十进制解释
$((变量名)):对变量进行算数运算 $[变量名]:对变量进行算数运算\在shell中做转义字符,和C语言蕾丝,用于去除紧跟在其后的单个字符的特殊意义
单引号不能展开变量,双引号可以展开变量
使用命令test测试,结果为真返回0,为假返回1
-d DIR:如果DIR存在并且是一个目录则返回真 -f FILE 如果FILE存在且是一个普通文件则为真 -z STRING 如果STRING的长度为0则为真 -n STRING 如果STRING的长度非0则为真 STRING1=STRING2:如果两个STRING相同则为真 STRING1!=STRING2:如果两个字符串不相同则为真 ARG1 OP ARG2:ARG1和ARG2应该是整数或者取值为整数的变量,OP是-eq(等于),-ne(不等于),-lt(小于),-le(小于等于),-gt(大于),-ge(大于等于)之中一个 -a:逻辑与 -o:逻辑或#! /bin/bash
if [ -f test ];then
echo 'It is a file!'
else
echo 'It is not file!'
fi
运行结果#!/bin/bash
echo '请输入文件名:'
read file_name
case "$file_name" in
test|file1|file2)
echo 'It is a file';;
testdir|dir1|dir2)
echo 'It is a dir';;
p1)
echo 'It is a pipe';;
*)
echo "not found";;
esac
运行结果shell脚本中的for循环类似于python中的foreach循环
#! /bin/bash
for TEST in `ls`;do
ls -l $TEST
done
运行结果#! /bin/bash
echo '请输入密码:'
read passwd
count=1
while [ $passwd!="ysw" -a $count -lt 3 ];do
echo 'Try again'
read passwd
count=$[count+1]
done
运行结果break[n]可以指定跳出多层循环,continue跳出本次循环,用法和C语言一样,此处不多赘述
4. 位置参数和特殊变量 $0:相当一C语言中的argv[0] $1、$2……:位置参数,相当于C语言中main函数的argv[1]、argv[2]…… $#:相当于C语言main函数的argc -1(命令行参数个数-1) $@:表示参数列表"$1""$2"…… $*:表示参数列表,同上 $?:上一条命令的Exit Status $$:取当前进程号 shift:左移命令行参数 5. 输入输出 5.1 echoecho:显示 文本行或变量,或者把字符串输入到文件
echo [option] string
-e:解析转义字符
-n 不回车换行,默认echo后面跟回车换行
通过"|"把一个命令的输出传递给另一个命令的输入
把结果输出到标准输出,另一个副本输出相应文件
函数名() {函数体}:没有返回值
#! /bin/bash
fun(){
echo $0
echo $1
echo $2
echo $3
}
echo $0
echo $1
echo $2
echo "---------start"
fun 1 2 3
echo "---------end"
运行结果