LinuxC高级_day4
【1】功能性语句
- read
1)read var1 var2 var3
把读入行的第一个参数给var1 第2个参数给var2 把剩下的所有单词都给var3
2)read -n 5 var
从终端读取5个字符,输入到5个就自动结束
3)read -p “提示语句” var
4) read -s var 输入的时候取消回显
5)read -t 3 var 3秒内没有动作就跳过了
6)read -a 数组名 输入一个数组,数组之间的成员以空格隔开
[练习] 提示用户输入密码,密码不显示,3秒内没动作就跳过
read -s -t 3 -p “input a passwd>:” var
echo $var
- expr
- 算术运算符,用于简单的整数运算 + - * / %
- 乘号必须要加转义 * 括号需要转义 ( )
- 符号和数字之间必须要有空格,括号的左右两边也要有空格
- expr自带打印输出功能
- 想把expr的值给到一个变量必须要命令置换`` $()
- expr不能进行++ --的操作
- 如果想引用变量的时候,变量前必须加$符号
[练习] 计算表达式 a*b+c-d/b a=2 b=3 c=15 d=18
要求:从终端读入4个数字
read a b c d
expr $a * $b + $c - $d / $b
2)对字符串操作
1. 求字符串的长度
expr length $str ---- ${#变量名}
2. 子字符串在第一次出现在源字符串的位置
str=“www.baidu.com”
expr index $str “du” – 8
3. expr substr 源字符串 开始的位置 截取的长度
expr substr $str 5 5 — baidu
4. 从头开始比较,如果相同返回字符串的长度,不相同返回0
expr match $str “www.baidu.com”
-
let 用来做一些算术运算
1)符号和数字之间不能有空格
2)let没有打印的功能要echo输出
3)let在引用变量的时候可以不加$符号
4)let num=num**2 表示的是平方 -
test 可以用来测试三种对象:字符串 整数 文件属性
1) 字符串的测试
s1 = s2 比较两个字符串内容是否相同
s1 != s2 比较两个字符串内容是否不相同
-z s1 测试字符串长度是否为0
-n s1 测试字符串长度是否不为0
s1 > s2 s1 < s2 和strcmp功能一致,判断字符串大小
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)文件属性测试
-e name 测试文件是否存在
-s name 判断文件是否存在并且判断是否为空
-d name 判断是否是个目录
-f name 判断是否是个普通文件
-L name 判断是否是个软链接文件
-p name 判断是否是个管道文件
-S name 判断是否是个套接字文件
-b name 判断是否是个块设备文件
-c name 判断是否是个字符设备文件
4)文件权限测试
-w name 判断文件是否有可写的权限
-r name 判断文件是否有可读的权限
-x name 判断文件是否有可执行的权限
eg:
read var
test “$var” = “hello”
echo $?
read num
test $num -eq 5
echo $?
-
(())的用法
((表达式))
((表达式1,表达式2,…表达式n))1)(())内部和C语言语法一致
2)如果要获取(())里面的结果要加$
3)(())内部可以写复杂的语句
4)(())内部使用变量的时候可以加 也 可 以 不 加 也可以不加 也可以不加
5)(())内部有多个表达式的时候,最后一个表达式的结果作为整条语句的结果
eg01: 判断闰年
echo $((($1%40 && $1%100!=0)||($1%4000)))
echo $?
bash XX.sh 2000
– 1 //是闰年
– 0 //上一条命令正常退出
bash XX.sh 2001
-- 0 //不是闰年
-- 0 //上一条命令正常退出
eg02: 1-100求和
sum=0
for ((i=0;i<=100;i++))
{
((sum+=i))
}
echo $sum
【2】shell数组
-
shell中只存在一维数组不存在多维数组
-
数组定义格式
arr=(11 22 33)
arr=(11 hello lala)
arr=([0]=11 [5]=hello)
arr=($1 $2 $3)read a b c
arr=($a $b $c)read -a arr # 1 hello 99 输入数组的成员用空格分开
echo ${arr[@]} -
数组成员的访问
访问数组中的某一个成员 ${arr[i]}
访问数组中的所有成员 ${arr[@]} ${arr[*]} -
求大小
${#变量名} 求变量的大小
${#arr[i]} 求数组里第i个元素的大小
${#arr[@]} ${#arr[*]}已被赋值的成员的个数
[练习1]
arr1=(11 22 33)
arr2=(aa bb cc)
1. 数组的成员追加 给arr1追加一个hello元素
arr1=(${arr1[@]} hello)
echo
a
r
r
1
[
∗
]
2.
数
组
的
合
并
把
a
r
r
1
和
a
r
r
2
放
到
a
r
r
3
里
a
r
r
3
=
(
{arr1[*]} 2. 数组的合并 把arr1和arr2放到arr3里 arr3=(
arr1[∗]2.数组的合并把arr1和arr2放到arr3里arr3=({arr1[*]} ${arr2[@]})
echo ${arr3[@]}
[练习2] 使用read向数组arr输入五个成员,显示提示语句,3秒内没输入就跳过
read -t 5 -p “please input :>” -a arr
echo ${arr[@]}
[练习3] 通过命令行输入任意多个整数,对他们求和
bash test.sh 10 20 88
arr=(KaTeX parse error: Expected 'EOF', got '#' at position 5: @) #̲获取命令行所有的参数放到数组里…#;i++)) #取命令行参数的个数或者数组长度
{
((sum+=${arr[i]}))
}
echo $sum
【3】结构性语句
-
if语句 if … then … fi
1)基本结构
if 表达式
then
命令表
fi
2)分层结构
if 表达式
then
命令表
else
命令表
fi
3)嵌套结构
if 表达式
then
命令表
else
if 表达式
then
命令表
fi
fi- elseif形式
if 表达式1
then
命令表1
elif 表达式2
then
命令表2
elif 表达式3
then
命令表3
fi
- elseif形式
-
if判断语句 if [ ]
中括号左右两边都要有空格
eg:
read n
if test $n -eq 5 #test语句变成if判断语句
#if [ $n -eq 5 ]
then
echo “is 5”
else
echo “not 5”
fi -
逻辑运算符
||逻辑或
[ 表达式1 ] || [ 表达式2 ]
[ 表达式1 -o 表达式2 ]&&逻辑与
[ 表达式1 ] && [ 表达式2 ]
[ 表达式1 -a 表达式2 ]!逻辑非
[ !表达式 ]
[练习]
-
从终端输入两个字符串来比较大小
if [ -z “ s t 1 " − o − z " {st1}" -o -z " st1"−o−z"{str2}” ] -
用if语句判断7种文件类型,输入一个文件名,输出对应的文件类型 bash test.sh
2.sh
read -p “input>” pathname
if [ -f $pathname ] -
case … esac
case 字符串变量 in
模式1)
命令表1
;;
模式2|模式3)# 两种模式都符合
命令表2
;;
模式n) # 通常写成 *)
命令表n
;;
esac
[练习] 成绩管理
-
if
<0 >100 exit //判断成绩合法=90 <100
=80 <90
=70 <80
=60 <70 -
case
G = 分数 / 10
case G in
90 100 - A
60 70 80 - B
其他 - C -
for …do …done
格式
1)for i in 1 2 3 4
do
done
2) for i in {1…10}
do
done
3) for ((i=0;i<=10;i++))
do
done
eg : 求1-100的和
sum=0
for var in {1…100}
#for var in $(seq 1 100)
#for var in $(seq 1 2 10)
do
((sum+=var))
done
echo $sum
[练习] 求目录下文件的个数
bash test.sh
ls -l|grep “^-”|wc -l
arr=(ls -l
)
for -f num++
[作业] shell脚本写一个冒泡排序
read -a arr
for for
if -gt -lt