Shell是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁
Shell既是一种命令语言,又是一种程序设计语言
作为命令语言,它交互式解释、执行用户输入的命令
作为程序设计语言,它定义了各种变量、参数,并提供许多在高级语言中才有的控制结构,包括循环、分支
Shell执行命令方式
交互式
解释、执行用户的命令,用户输入一条命令,Shell解释、执行一条
批处理
用户事先写一个Shell脚本,Shell一次性执行完多条命令,不必逐条敲命令
Shell脚本解释器
常见的有:bash、sh、ash、csh、ksh
sh是Bourne Shell的缩写,是Unix默认标准的shell
bash是Bourne Again Shell的缩写,是linux默认标准的shell;本文就是基于bash
Shell脚本语言与编译型语言差异
脚本编程语言好处是它们多半运行在比编译型语言还高的层级,能轻易处理文件与目录之类的对象
编译型语言
这类语言需预先将编写好的源代码转换成目标代码,这个过程被称为编译
如C、C++、Java
解释型语言
解释型语言也称为脚本语言;执行这类程序时,解释器需读取编写好的源代码,并将其转换成目标代码,再由计算机运行
因执行程序时多了编译过程,因此效率有所下降,通常不如编译型语言
如Perl、Python、Ruby与Shell
Hello, World
#!/bin/bash echo "Hello, World"
保存文件为hello.sh,保存格式为.sh
作为可执行程序
chmod +x ./hello.sh #更改文件权限为可执行程序 ./hello.sh #执行程序
作为解释器参数
hello.sh
Shell变量
变量声明调用
#!/bin/bash lang="Hello, World" echo $lang #简便 echo ${lang} #更标准
只读变量
#!/bin/bash lang="Hello, World" readonly lang #只读 lang="Bye" #报错
删除变量
#!/bin/bash lang="Hello, World" unset lang #删除 echo lang #空
交互式变量
#!/bin/bash echo "What is your name" read name #用户敲击输入自己的姓名 echo "Hello, $name" #输入的姓名(注:必须为双引号)
特殊变量
$0 #当前脚本文件名 $n #传递给脚本或函数的参数 $# #传递给脚本或函数的参数个数 $* #传递给脚本或函数的所有参数 $@ #传递给脚本或函数的所有参数 $? #上个命令的退出状态或函数的返回值 $$ #当前Shell脚本进程ID
替换变量
${var} #原值 ${var:-word} #原值为空或已删除,返回word,但不改变原值 ${var:=word} #原值为空或已删除,返回word,更改原值为word ${var:?message} #原值为空或已删除,将消息message传送至标准错误输出 ${var:+word} #原值被定义,返回word,但不改变原值
转义字符
\ #反斜杠 a #警告 #退格 f #换页 #换行 #回车 #水平制表符 v #垂直制表符
Shell运算符
算术运算符
+ #加法 - #减法 * #乘法 / #除法 % #取余 = #赋值 == #相等 != #不相等
算数运算符用法示例
#!/bin/bash number=`expr 5 + 5` #加法 echo $number
关系运算符
-eq #是否相等 -ne #是否不相等 -gt #是否大于 -lt #是否小于 -ge #是否大于等于 -le #是否小于等于
关系运算符用法示例
#!/bin/bash if [ 5 -eq 5 ] #是否相等(注:必须空格分开) then expression fi
字符串运算符
= #字符串是否相等 != #字符串是否不相等 -z #字符串长度是否等于0 -n #字符串长度是否大于0 str #字符串是否为空
布尔运算符
! #非 -o #或 -a #且
文件运算符
-b file #文件是否是块设备文件 -c file #文件是否是字符设备文件 -d file #文件是否是目录 -f file #文件是否是普通文件 -g file #文件是否设置SGID位 -k file #文件是否设置粘着位 -p file #文件是否是具名管道 -u file #文件是否设置SUID位 -r file #文件是否可读 -w file #文件是否可写 -x file #文件是否可执行 -s file #文件是否为空 -e file #文件是否存在
Shell字符串
拼接字符串
#!/bin/bash lang="World" echo "Hello, "$lang echo "Hello, $lang"
获取字符串长度
#!/bin/bash lang="Hello, World" echo ${#lang}
提取字符串
#!/bin/bash lang="Hello, World" echo ${lang:1:4}
查找子字符串
#!/bin/bash lang="Hello, World" echo `expr index "$lang" llo`
Shell数组
数组声明
#!/bin/bash array=(value value)
或
#!/bin/bash array=( value value )
或
#!/bin/bash array[0]=value array[1]=value
数组调用
#!/bin/bash array=(value value) echo ${array[index]} #输出元素 echo ${array[*]} #输出所有元素
获取数组长度
#!/bin/bash array=(value value) echo ${#array[*]}
获取数组元素长度
#!/bin/bash array=(value value) echo ${#array[index]}
Shell if else语句
if ... fi
#!/bin/bash if [ condition ] then expression fi
if ... else ... fi
#!/bin/bash if [ condition ] then expression else expression fi
if ... elif ... fi
#!/bin/bash if [ condition ] then expression elif [ condition ] then expression else expression fi
Shell case语句
#!/bin/bash case value in model) expression ;; model) expression ;; *) expression ;; esac
Shell for循环
#!/bin/bash for v in value do echo $v done
Shell while循环
#!/bin/bash while [ condition ] do expression done
Shell until循环
#!/bin/bash until [ condition ] do expression done
Shell函数
函数声明调用
#!/bin/bash function () { expression } function
函数传参
#!/bin/bash function value value
参数调用
$n #传递给函数的参数 $# #传递给函数的参数个数 $* #传递给函数的所有参数 $@ #传递给函数的所有参数 $? #函数返回值
Shell文件包含
#!/bin/bash . file source file