课堂内容
复习问题:
printf = "hello,world!"
printf "%s\n" $string
printf "%sn" "hello, world!"
printf "%s\n" hello, world!
printf "%s\n" "${string}"
三种写法:
$string
${string}
"$string"
printf打印字符串:
若变量值中有空格,则打印时使用"$变量名"
字符串赋值时,若值中有空格,用""括起来
变量名="hello world"
$引用变量,不能够把" "一起引用,因此打印时,需用"$变量名"
1.字符串
(1)字符串的拼接
引用字符串的值,并将多个字符串的值作为新的字符串付给新的变量,即:str="$string1 $string2"
(2)字符串的长度
lenth=${#string}
- 此时#不是注释,表示计算字符串的长度
(3)字符串的分割
nstr=${string:a:b}
把字符串string从第a个之后开始截取b个字符,赋给新的变量
2.只读readonly
num=34
echo $num
num=88 #错误(error)
echo $sum
只读变量的值无法修改!!!
3.清除变量的值
num=333
echo $num
unset num
echo $num
- 注意:unset是清除变量的值。若变量未定义直接使用,其值为空
4.再次强调
(1)shell程序必须指定脚本的解释程序
- 在shell脚本程序的第一行必须是:#!/bin/bash
(2)空格问题
- 变量赋值时,=两边不可有空格其他情况:尽量加空格
5.权限问题
sudo chmod a+x filename 所有用户
sudo chmod u+x,g+x filename 使用者和所在的组
sudo chmod +x filename 所有用户
sudo chmod 777 filename 所有权限
6.从键盘获取变量值
read:在没有输入时,则一直等待输入、
read 变量1 变量2 变量3(此情况,将输入的第一个值赋给变量1,第二个值给变量2,剩余的值全部给变量3)
不建议使用:
read num1 num2 num3...
建议:
read num1
read num2
read numn
7.shell的三大语句
功能型语句、说明型语句、结构分支语句
(1)说明型语句
以#开头的语句,至行未均为说明型语句,说明型语句不解释执行(整行)即注释
说明型语句的位置可以程序中的任何位置,可以放在解释执行语句之后,从#开始的部分到行末(只能注释一行)
(2)功能型语句
系统命令,自写程序....
(3)结构型语句
多露分支语句,循环语句,循环控制语句,测试语句,条件语句,结构型语句
8.加,减,乘,除,取余(整数)
expr let:针对整数做简单的加、减、乘、除、取余(整数)
expr:
sum=`expr $sum + $sum1`
sum1=`expr $sum \* $sum1`
let:
let sum=num+num1
let sum1=num\*num1
乘法*:\是去掉的元意,告诉我们解释器这是真的乘法!!
:取得结果集*
$( ):取得结果集
9.条件测试语句
test 测试语句
[ 条件测试语句 ]:注意[ ]中的空格!!
文件测试:
-e file:测试file时候存在
-d file:ceshifile是否是目录
-f file:测试file是否是文件
-r file:测试file是否可读
-w file:测试file是否可写
-x file:测试file是否可执行
算数比较运算符:
-eq:是否
-ne:是否不等
-gt:是否大于
-ge:是否大于等于
-lt:是否小于
-le:是否小于等于
字符串比较:
-z string:string长度是否为零
-n string:若string非零,为真
string=string1:是否相同
string!=string1:是否不同
逻辑操作符:
&&:逻辑与
事件1 && 事件2:当事件1和事件2都为真,则为真
||:逻辑或
当事件1 || 事件2:当事件1或事件2为真,则为真
-a:and
-o:or
常见变量:
$?:命令执行后的返回状态,返回零表示执行成功
$*:所有参数列表
$@:所有参数列表
$#:传递到脚本的参数个数
$0:可执行命令本身,不是位置参数
$1~$n:分别表示第一个至第n个位置参数
echo -n:不换行输出!
10.if语句
(1)语法机构
if [ 条件 ]
then
命令
fi
或者
if [ 条件 ]
then
命令
elif
[ 命令 ]
then
命令
else
命令
fi
若表达式为真,则执行命令表1中的命令,退出if语句;否则执行命令表2中的语句if
(3)case语句的用法:
test命令测试的条件成立时,命令返回值为真,否则返回值为假
方式一:
test $name -eq $1
echo $?
方式二:
if test -f $filename
then
...
fi
方式三:
if [ -f $filename ]
then
...
fi
10.case...esac
多路分支语句case用于多重条件测试,语法结构清晰自然,语法结构为:
case 字符串变量 in #case语句只能检测字符串变量
语句结构:
模式1)(各模式中可用文件名元字符,以右括号结束)
命令表1;;(命令表以单独的双分号行结束,退出case语句)
模式2)
命令表2;;
...
模式n)
命令表n;;
esac
还可以指定以下字符串集合:
| 多重选择
? 任意一个字符
* 任意多个字符
[ a-z ] a至z之间的任意字符
11.for 循环
for...do...done
当循环次数确定时,使用for循环语句来多次执行一条或一组命令,循环体由语句括号do和done来限定。
格式为:
for 变量名 in 值列表
do
命令
done
变量名以此获取单词表中的各个单词,每取一次值,就执行一次。
循环体中的命令,循环次数由值列表中的单词数确定,命令表中的命令可以是一条,也可以是由分号或者换行符分开的多条。
若单词表是由命令行上的所有位置的参数时,可以在for语句中省略“in 单词表”部分!
方法二:
for(i=0;i<10;++i)
注意:
for循环值列表可以省略,默认从输入参数中获取
12.while
语法结构:
while 条件或命令表达式
do
命令
done
while语句首先测试其后的命令或者表达式的值,如果为真,就执行一次。
循环体中的命令,然后在测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
while语句的退出状态为命令表中被执行的最后一条。
13.break和continue
break n(跳出n层)
continue语句则马上转到最近一层循环语句的下一轮循环上。
continue n(跳转到最近n层循环语句的下一轮循环上)。
课后作业
作业:(待完成...)
1.使用while循环实现九九乘法表
2.for或者while实现打印等腰三角形,行数由用户输入
3.写一个脚本,判断给定目录下的文件属性
4.预习C语言课本前三四五章,下周进入C部分的学习