zoukankan      html  css  js  c++  java
  • 4. linux编程语法

    一. linux shell 编程语法

    1. 变量

    1.定义与使用变量

    var_name="123"  # 变量定义的 = 两边不能有空格,如 var_name = "123" 会报错
    echo $var_name  # 通过 $变量名 来使用变量
    

    2. 将变量设置为只读变量

    var_only_read="Hello"
    readonly var_only_read  # 通过readonly关键字
    

    3. 删除变量

    unset var_name
    # 注意:只读变量是不能被删除的
    # 如果要删除只读变量,关闭 shell 终端,重新打开就没有了。 因为变量的作用范围就是在当前shell窗口
    

    4. 变量类型

    1. 字符串: var_name="victom"

    2. 拼接字符串: greeting="hello,$var_name !"

    3. 数组:

      1)array_name=(value0 value1 value2):一次性声明多个数组成员,元素与元素之间使用空格分割
      2) array_name[0]=value0: 单独赋值

    4. 取数组: value=${array_name[n]}

    • 实战
    1. 数组初始化
    my_arr=(a b "c" d)
    echo "第一个元素是:${my_arr[0]}"
    echo "使用*或者@取出所有数组元素: ${my_arr[@]}, ${my_arr[@]}"
    
    1. 数组单个定义
    my_arr[0]=1
    my_arr[4]=4
    echo "使用*或者@取出所有数组元素: ${my_arr[@]}, ${my_arr[@]}"
    
    

    2. 控制语句 if,for, while

    1. if

    # 语法
    if [ 条件 ];  # 条件必须用[]包裹起来,条件表达式左右要有一个空格
    then
      指令1;
      指令2;
    fi 
    
    # 实例1
    if [ 2==2 ];then echo "true";else echo "false";fi
    # 实例2: 如果要用 > 表示,则要用两个 [[   ]]
    if [[ 2>1 ]];then echo "true";else echo "false";fi
    
    # 实例3: 如果要用一个 [  ],则要使用 -gt -lt 表示大于或小于
    if [ 2 -gt 2 ];then echo "true";else echo "false";fi
    
    • 实战
      比较两个变量的大小,并输出不同的值
    a=90
    b=100
    if [ $a -eq $b ]; then echo "equal"; elif [ $a -gt $b ]; then echo "big";elif [ $a -lt $b ];then echo "small";fi
    

    2. for

    # 语法
    for var in item1 item2 ...itemN
    do
      指令1
      指定2
    done
    
    #实例
    for i in 1 2 3 4 5
    do
      echo "hello $i"
    done
    
    • 实战
      循环读取test.txt文件内容并输出
    # cat test.txt:显示文件内容
    # $(cat test.txt): 表示把cat test.txt当做命令执行得到一个结果,然后交给for循环去循环
    
    for line in $(cat test.txt)
    do 
      echo $line
    done
    
    

    3. while

    # 语法
    while 条件
    do
      指令..
    done
    
    #示例
    a=1
    # 注意 while后面的条件要用 ()括号
    while (( $a < 5 ));do echo $a; let a++; done;
    
    
    • 实战
      循环读取文件内容并输出
    # read line : 表示读取文件中的行,line是变量
    # < test.txt: 表示从这个文件读取内容
    
    while read line; do echo $line; done < test.txt
    
    

    二. bash脚本的编写

    1. read命令

    定义

    read 命令是用于从终端或者文件中读取输入的内容的 内部命令,读取的是整行输入,每行末尾的换行符不被读入

    read命令使用

    1. 从标准输入读取输入并赋值给变量
    read var
    键盘输入一个内容, 就会自动赋值给变量var
    
    echo $var
    
    1. 从标准输入读取多个内容
    read var1 var2 var3
    
    1. 不指定变量(默认赋值给REPLY)
    read
    

    2. 脚本参数传递

    脚本是放在.sh文件中的,因此可以给.sh脚本进行参数传递
    执行.sh文件的时候,空格 参数就可以传递进去了

    $0: 脚本名称
    $1~$n: 获取参数,打印传参的内容
    $#: 传递到脚本的参数个数
    $$: 脚本运行的当前进程ID号
    $*: 以一个单字符串显示所有向脚本传递的参数
    $?: 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
    

    -实战
    新建一个test.sh文件

    #!/bin/bash  # 第一行输入这个内容,目的指定bash shell
    echo $1,$2,$3  # $1,$2,$3 分别对应着传递进来的参数
    echo "这个shell的文件名是:" $0
    echo "参数数量是: " $#
    echo "参数的所有内容: " $*
    echo "脚本的返回状态:" $?
    

    执行脚本并传递参数,参数111 222 333 直接跟在执行的文件名后面就行

    3. 基本运算

    a=1 b=2
    # 语法有严格的格式要求
    # 1. 加减乘除运算,必须用 反引号 `` 括起来
    # 2. 整个计算表达式之间必须有三个空格:expr与$a, $a与+,+与$b之间共有三个空格
    +: 加法 `expr $a + $b`
    -: 减法 `expr $a - $b`
    *: 乘法 `expr $a * $b`
    /: 除法 `expr $a / $b`
    
    %: 取余 `expr $a % $b`
    =: 赋值 a=$b 将把变量b的值赋给a
    ==: 相等 相同则返回true; [ $a == $b ] 返回 false
    !=: 不相等 不相等则返回true; [ $a != $b ] 返回 true
    
    -eq: 检查相等 [ $a -eq $b ] 返回false
    -ne: 检查不相等 [ $a -ne $b ] 返回true
    -gt: 检查左边大于右边 [ $a -gt $b ] 返回false
    -lt: 检查左边小于右边 [ $a -lt $b ] 返回true
    -ge: 检查左边是否大于等于右边 [ $a -ge $b ] 返回false
    -le: 检查左边是否小于等于右边 [ $a -le $b ] 返回false
    

    4. bash与linux的命令组合

    1. bash与目录命令

    # 下面的命令可以直接卸载一个 .sh文件里面
    mkdir test
    cd test
    echo "hello" > test.txt  #  将hello文本重定向写入到test.txt文件
    ls
    

    2. bash与内存

    # 统计内存使用
    ps aux
    
    • 实战
      ps aux得到进程号后,提取PID
    
    # 解析
    # ps aux | awk:列出所有进程并交个 awk处理
    # awk '{print $2}': awk根据空格分割,打印出第二列内容,其中首行PID是显示出来的
    # grep -v PID: 不显示首行PID
    
    ps aux | awk '{print $2}' | grep -v PID
    
  • 相关阅读:
    「SHOI2015」脑洞治疗仪
    LOJ 数列分块入门 8
    CF932F Escape Through Leaf
    NOIP2021游记总结
    [HEOI2016/TJOI2016]序列
    【模板】动态树(Link Cut Tree)
    LG P2839 [国家集训队]middle
    JZOJ 7377.欢乐豆
    JZOJ 7392. 【2021.11.17NOIP提高组联考】数 (ds)
    LOJ 数列分块入门 6
  • 原文地址:https://www.cnblogs.com/victorm/p/14141779.html
Copyright © 2011-2022 走看看