shell学习
- shell脚本
- 编写步骤
- shell变量
- 功能性语句
- 1.read
- 2.expr
- 3.let
- 4.test
- 逻辑运算符的书写格式
 
- 结构性语句
- 1.if…then…fi
- 2、case...esac
- 3、for..do..done
- 4、while..do..done
 
shell脚本
将shell命令按照一定的逻辑顺序实现指定功能,放到一个文件中。文件叫脚本文件,后缀.sh,可以直接执行,不用编译。shell脚本语言是解释型语言
编写步骤
1、编辑脚本内容
 vi xxx.sh
 2、将脚本文件权限修改为可执行
 chmod 777 xxx.sh
 3、执行脚本文件
 ./xxx.sh 或 bash xxx.sh
shell变量
1.shell中允许建立变量存储数据,但是不支持数据类型,所有赋值给变量的值都解释为一串字符。
2.变量的定义格式:
 变量名=值(等号两边都不能有空格)
 取shell变量的值:$变量名
3.shell变量的分类
 (1)环境变量 printenv 或 env
 HOME=/home/hq 
 (2)用户自定义变量
 在shell编程中通常定义的变量名用大写,变量的调用:
 $变量名
 Linux Shell/bash从右向左赋值
 使用unset命令删除变量的赋值
 (3)位置变量或命令行参数
 $0 执行的脚本名
 $1-$9 ${10}-${n} 命令行空格传的参数
 $# 命令行参数个数,除$0
 $@ $* 遍历输出命令行参数内容
 4)预定义变量
 $? 获取的是上一句命令是否正确执行的结果
 0:真
 非0:为假
 $$ 获取进程pid
功能性语句
1.read
从终端获取值赋值给变量。
格式:read 变量名1 变量名2 …
 加提示语句:read -p “提示字符串” 变量名1 变量名2 …
注:把终端读入空格隔开的第一个单词赋值给第一个变量,第二个
 单词赋值给第二个变量,依次类推赋值,剩余所有单词赋值
 给最后一个变量。
 
2.expr
算术运算命令expr主要用于进行简单的整数运算,
 包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作
 注意:
 1)运算符左右两侧必须有空格
 2)*和()必须加转义字符,\* 、 \( \)
 3)expr语句可以直接输出运算结果
 
3.let
在运算中不能有空格
 运算结果需要赋给一个变量
 变量参与运算的过程不用加$取值
 
4.test
test语句可测试三种对象:字符串 整数 文件属性
 1)字符串的测试:(等号两边加空格)
s1 = s2 	测试两个字符串的内容是否完全一样
真,假
echo $?
s1 != s2	测试两个字符串的内容是否有差异
-z s1 		测试s1 字符串的长度是否为0
-n s1 		测试s1 字符串的长度是否不为0

2)整数的测试:
a -eq b 		测试a 与b 是否相等
a -ne b			测试a 与b 是否不相等
a -gt b 		测试a 是否大于b
a -ge b 		测试a 是否大于等于b
a -lt b 		测试a 是否小于b
a -le b 		测试a 是否小于等于b	
3)文件属性的测试;
-d name     	测试name 是否为一个目录
-f name 		测试name 是否为普通文件
-e name     	测试文件是否存在

逻辑运算符的书写格式
|| :逻辑或  
	[ 表达式1 ] || [ 表达式2 ] 
	[ 表达式1 -o 表达式2 ]
&& :逻辑与 
	[ 表达式1 ] && [ 表达式2 ] 
	[ 表达式1 -a 表达式2 ]
!  :逻辑非 
	[ ! 表达式 ]
结构性语句
1.if…then…fi
基本结构:
if    表达式
then  
  命令表
fi 

如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。if和fi是条件语句的语句括号, 必须成对使用;命令表中的命令可以是一条, 也可以是若干条。
 分层结构1:
if      表达式
	then 
	命令表1
	else  
	命令表2
	fi

分层结构2:
if 表达式1
	then 
		命令表1
	elif  表达式2
	then
		命令表2
	elif 表达式3
	then 
		命令表3
        else
		命令表4
	fi
嵌套结构:
if      表达式
    then 
		命令表1
    else  
		if    表达式
		then  
			命令表
		fi  
    fi

注意:如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。 if和fi是条件语句的语句括号, 必须成对使用;命令表中的命令可以是一条, 也可以是若干条。
2、case…esac
case   字符串变量   in
        模式1)
                命令表1
                ;;(相当于C语言中的break)
        模式2)
                命令表2
                ;;
             ……
        *)
                命令表n
                ;;
	esac
注意:
 1)case语句只能检测字符串变量
 2)命令表以单独的双分号行结束,退出case语句
 3)模式 n常写为字符* 表示所有其它模式
 4)case匹配项中可以存在多个模式,
 
 
3、for…do…done
格式:
for   变量名   in   单词表
    do
        命令表
    done
变量依次取单词表中的各个单词,每取一次单词, 就执行一次循环体中的命令,循环次数由单词表中的单词数确定,命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。
 
for语句的几种书写格式:
 (1)for i in 1 2 3 4 do…done :
 变量i从单词表中取值
 (2)for i do…done:
 变量i从命令行取值,可以省略in 单词表
(3)for i in {1…10} do…done:
 (大括号和数字之间不加空格)
 变量i从1~10
 (4)for ((i = 0; i < 10; i++)) do…done
shell脚本的死循环
 (1)
for((;;))
do
	echo "for"
 done
(2)
while true
do
 echo "while"
done
4、while…do…done
格式:
while  命令或表达式
do
        命令表
done
while语句首先测试其后的命令或表达式的值,
 如果为真,就执行一次
 然后再测试该命令或表达式的值,
 执行循环体,直到该命令或表达式为假时退出循环。
 



















