LinuxC高级 Day5

LinuxC高级_day4

【1】功能性语句

  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

  1. expr
  1. 算术运算符,用于简单的整数运算 + - * / %
    1. 乘号必须要加转义 * 括号需要转义 ( )
    2. 符号和数字之间必须要有空格,括号的左右两边也要有空格
    3. expr自带打印输出功能
    4. 想把expr的值给到一个变量必须要命令置换`` $()
    5. expr不能进行++ --的操作
    6. 如果想引用变量的时候,变量前必须加$符号

[练习] 计算表达式 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”

  1. let 用来做一些算术运算
    1)符号和数字之间不能有空格
    2)let没有打印的功能要echo输出
    3)let在引用变量的时候可以不加$符号
    4)let num=num**2 表示的是平方

  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. (())的用法
    ((表达式))
    ((表达式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数组

  1. shell中只存在一维数组不存在多维数组

  2. 数组定义格式
    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[@]}

  3. 数组成员的访问
    访问数组中的某一个成员 ${arr[i]}
    访问数组中的所有成员 ${arr[@]} ${arr[*]}

  4. 求大小
    ${#变量名} 求变量的大小
    ${#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.arr1arr2arr3arr3=({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】结构性语句

  1. if语句 if … then … fi
    1)基本结构
    if 表达式
    then
    命令表
    fi
    2)分层结构
    if 表达式
    then
    命令表
    else
    命令表
    fi
    3)嵌套结构
    if 表达式
    then
    命令表
    else
    if 表达式
    then
    命令表
    fi
    fi

    1. elseif形式
      if 表达式1
      then
      命令表1
      elif 表达式2
      then
      命令表2
      elif 表达式3
      then
      命令表3
      fi
  2. 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

  3. 逻辑运算符
    ||逻辑或
    [ 表达式1 ] || [ 表达式2 ]
    [ 表达式1 -o 表达式2 ]

    &&逻辑与
    [ 表达式1 ] && [ 表达式2 ]
    [ 表达式1 -a 表达式2 ]

    !逻辑非
    [ !表达式 ]

[练习]

  1. 从终端输入两个字符串来比较大小
    if [ -z “ s t 1 " − o − z " {st1}" -o -z " st1"oz"{str2}” ]

  2. 用if语句判断7种文件类型,输入一个文件名,输出对应的文件类型 bash test.sh
    2.sh
    read -p “input>” pathname
    if [ -f $pathname ]

  3. case … esac
    case 字符串变量 in
    模式1)
    命令表1
    ;;
    模式2|模式3)# 两种模式都符合
    命令表2
    ;;
    模式n) # 通常写成 *)
    命令表n
    ;;
    esac

[练习] 成绩管理

  1. if
    <0 >100 exit //判断成绩合法

    =90 <100
    =80 <90
    =70 <80
    =60 <70

  2. case
    G = 分数 / 10
    case G in
    90 100 - A
    60 70 80 - B
    其他 - C

  3. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值