1、 Shell脚本的执行方式
a) sh命令执行:sh hello.sh
b) 给脚本文件添加执行权限,使用./命令执行:chmod 755 hello.sh ./hello.sh
2、 Shell的基本元素
a) #!/bin/bash: 指出shell的类型,不指定的话默认是 /bin/sh
b) 注释:#注释内容
c) 变量:${变量名}
d) 控制:
3、 Shell中的特殊符号
a) 注释符# 除了#!/bin/bash里的#特殊
b) 美元符$
变量符。与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。变量字符长度超过1个时,用{}括起来
c) 单引号 被引起的字符全部做普通字符,即全部原样
echo ‘my $SHELL’
d) 双引号
引号内的内容,除$、转义符\、倒引号`这三个保留特殊功能,其他字符均做普通字符。
e) 倒引号(数字1键旁边的那个键)
引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。
f) 反斜线
反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。
4、 Shell变量
a) 本地变量 (局部变量):只在创建它们的Shell中使用,可以在shell程序内任意使用和修改它们。
本地变量 在用户现在的shell生命期的脚本中使用
变量名=值
注意:
(1)等号两边不可以有空格
(2)取值包含空格,必须用双引号括起来
(3)Shell变量可以用大小写字母,区分大小写
变量的声明和使用
(1)变量是弱类型的(不用声明类型)
(2)变量声明及赋值格式
变量=值(等号两边不能有空格)
(3)变量的引用
$变量名
${变量名}
b) 环境变量:可以在创建它们的Shell及其派生出来的任意子程序中使用。有些变量是用户创建的,其他的则是专用的(比如PATH、HOME)。是系统环境的一部分,不必去定义它们,可以在shell程序中使用它们 。还能在shell中加以修改。
u 环境变量可以在命令行中设置,但用户注销时这些值将丢失
u 环境变量均为大写
u 必须用export命令导出
(1) 设置环境变量
variable-name=value
export variable-name(环境变量名大写)
(2) 显示环境变量
env 可以看到所有的环境变量
echo $环境变量名 (显示一个变量)
(3) 清除环境变量
unset 环境变量名
c) 内部变量:由系统提供的。与环境变量不同,用户不能修改它们。
$#——传送给shell程序的位置参数的数量
$?——最后命令的完成码或者在shell程序内部执行的shell程序(返回值)
$0——shell程序的名称
$*——调用shell程序时所传送的全部参数的单字符串, “参数1”“参数2”…形式保存的参数
$@——“参数1”“参数2”…形式保存的参数
$n——第n个参数
$$——本程序的PID
$!——上一个命令的PID
5、 条件测试
可以判断脚本程序运行的状态
主要有三种形式:
a) test expr
b) [ expr
c) [[ expr
注意:
n 方括号的内侧两边各需一个空格
n 如果测试条件为真,test命令会返回0,否则返回一个非0的数值
n test 语句与if/then和case语句一起,构成shell编程的控制转移结构
区别test、[、[[
n test、[ 是 bash命令。
n [[ 是bash程序语言中的关键字。
n [[ 中使用 && 和 ||逻辑符号,可用通配符(使用通配符时字符串不要引号);
Expr
(1) 数值测试
-lt 小于 -le 小于等于 -gt 大于
-ge 大于等于 -eq 等于 -ne 不等于
(2) 文件测试
-f 存在且是普通文件
-d 存在且是目录
-s 存在且字节数大于0
-r 存在且可读
-w 存在且可写
-x 存在且可执行
(3) 字符串测试
test s 字符串s非空
test s1=s2 字符串s1等于s2
test s1!=s2 字符串s1不等于s2
test –z s 字符串长=0,即为空串
test –n s 字符串长>0
(4) 其他参数
-a 逻辑与
-o 逻辑或
! 逻辑非
6、 控制流程
a) 分支语句:if-then-else和case
if分支
if [ $# -eq 0 ]
then
echo “输入了0个参数”
elif [ $# -gt 1 ]
then echo “输入了多个参数”
else echo “输入了1个参数”
fi
case
case “$#” in
0) echo “输入了0个参数” ;;
1) echo “输入了1个参数” ;;
*) echo “输入了多个参数”;;
esac
每个分支条件后必须以两个分号结尾
一些比较有用的命令:
seq命令:产生1-9的数字序列;
expr命令:将其后的串解释为表达式并计算其值,运算符前后需有空格;用于整数值运算。
$[]将中括号内的表达式作为数学运算先计算结果再输出。
let表示强制进行数学运算,以为系统默认“+”等运算符是作为字符串处理的。
let “a+=1"
a=$[ $a + 1 ]
a=$(($a+1))
a=`expr $a + 1` #加号两边要有空格
前两种方式在bash下有效,在sh下会出错。
b) 循环语句:for while和until
for 例子——输出100内10的倍数
for i in `seq 1 9`
do
echo `expr $i \* 10`
done
read 变量1 [变量2 …]
可以从键盘上读取多个变量的值,用户输入数据时,以空格或者Tab键作为分隔。
如果输入的数据个数不够,则从左到右对应赋值,没有输入的变量为空;
如果输入的数据个数超了,则从左到右对应赋值,最后一个变量被赋予剩余的所有数据。
while例子——求1到100的和
i=1
sum=0
while [ $i –le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo $sum