• shell编程初级


    1. shell分类

    linux默认shell是bin/bash, 流行的shell有ash, bash, tcsh, ksh, zsh等。

    2. 创建和取消别名

    alias python='/path/to/python/python3'
    
    unalias python
    
    • 1
    • 2
    • 3

    3. bash初始化

    环境变量文件:

    /etc/profile
    /etc/bashrc
    ~/.profile
    ~/.bash_login
    ~/.bash_profile
    ~/.bashrc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4. 快捷键

    ctrl+A: 光标移动到开头。
    ctrl+E: 光标移动到结尾。
    ctrl+C: 强制终止。
    ctrl+L: 相当于clear.
    ctrl+U: 删除或剪切光标之前的内容。
    ctrl+K: 删除或剪切光标之后的内容。
    ctrl+Y: 粘贴剪切的内容。
    ctrl+R: 从历史命令中搜索。按下后会出现搜索界面。
    ctrl+D: 终结当前终端。

    5. 变量分类

    5.1 自定义变量

    定义变量, 必须以字母或下划线开头:

    var=value
    
    • 1

    引用变量:

    # 1. method 1
    var
    
    # 2. method 2
    {var}
    var=`pwd`
    
    # 3. method 3
    echo $var
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    变量仅在当前shell中有效。

    5.2环境变量

    export back_dir=/path
    
    # 将自定义变量转为环境变量
    export my_var
    
    # 引用环境变量
    var
    {var}
    
    # 查看环境变量
    echo $var
    
    # 取消环境变量
    unset var
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在当前shell和子shell中有效。

    5.3 位置变量

    $1 $2 $3 $4 $5
    
    • 1

    5.4 预定义变量

    $0表示脚本名。$#参数的个数, $$当前进程的PID$?上一个进程的PID
    $*所有参数, 会以一个整体$1 $2... $n的形式输出。$@所有的参数,会将各个参数分开,以$1, $2…的形式输出所有参数。

    $0 这个程式的执行名字
    $n 这个程式的第n个参数值,n=1…9
    $* 这个程式的所有参数,此选项参数可超过9个。
    $# 这个程式的参数个数
    $$ 这个程式的PID(脚本运行的当前进程ID号)
    $! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
    $? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
    $- 显示shell使用的当前选项,与set命令功能相同
    @ 跟 @ 跟 @*类似,但是可以当作数组用

    变量赋值:

    var=value
    d=`date +%F`
    d=$(date +%F)$
    
    • 1
    • 2
    • 3

    6. 变量引用

    school=1000phone
    
    echo "${school} is good."
    # out: 1000phone is good
    
    echo '${school} is good'
    # out: $school is good.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    反引号命令替换,相当于$(),反引号中的shell命令会被先执行。

    7. 变量运算

    7.1 整数运算

    7.1.1expr: 每个参数都要空格。
    expr 1 + 2
    
    a=1
    b=2
    
    expr $a + $b
    
    expr $b \* $a  # 乘法需要转义
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    7.1.2 $(())
    echo $(($a + $b))
    echo $((a+b))
    sum=$((5-3*2))
    echo $sum
    
    • 1
    • 2
    • 3
    • 4
    7.1.3 $[]
    echo $[5+2]
    echo $[$a+$b]
    
    • 1
    • 2
    7.1.4 let
    let sum=$a+$b
    echo $sum
    
    • 1
    • 2

    8. 变量内容替换

    echo ${var/val_1/val_2}
    
    • 1

    9. shell的函数

    # method 1
    function func_name {
    	commands
        return value
    }
    
    # method 2
    name(){
    	commands
        return value
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    也可以使用echo返回函数值。

    执行不带参数的函数:

    func_name
    
    • 1

    执行带参数的函数:

    func_name(){
    	$((sum=$1+$2))
        return sum
    }
    
    func_name arg1 arg2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    9. 定义数组

    arr=(val1, val2, val3, val4)  # =两边不能有空格
    
    # 产生1到10的整数
    a=$( seq 1 10 )
    a=({1..10})
    
    #组截取
    ${arr[@]:0:3}  # 从下标为0开始取3个
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    键值对定义:

    arr=([0]=val1 [1]=val2 [2]=val3)
    
    • 1

    数组遍历:

    for (( i=0; i<${#arr[@]}; i++))
    do
    	echo ${arr[i]}
    done
    
    for var in ${arr[@]}
    do
    
    	echo $var
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    多个for循环嵌套

    rounds=(round1 round2 round3 round4)
    pretrained_models=(random mg moco pgl sar)
    folds=(0 1 2)
    
    for round in ${rounds[@]}
    do
      for pre in ${pretrained_models[@]}
        do
          for fold in ${folds[@]}
            do
              echo $round $pre $fold
            done
        done
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    10 shell循环

    for val in arr
    do
    	echo $val
    done
    
    • 1
    • 2
    • 3
    • 4

    for每次从集合去一个值, do - done执行命令。

    while cond
    do
    	command
    done
    
    until cond
    do
    	command
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    11. 条件测试

    test - dir: 利用test测试,test与表达式之间至少一个空格。
    [ d dir ]件测试表达式[]与表达式之间至少一个空格。 []]: 通过[[]]双中括号测试,至少一个空格。 (())`: 通过双小括号测试,两端不需要空格,常用于整数对比。

    (()): 数值比较, 运算
    [[]]: 条件测试,支持正则
    $(()): 整数运算
    
    $[] 复数运算
    $() 命令替换, shell先执行括号中的cmd, 然后将结果作为变量进行替换。错误输出不能替换。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    -d dir: 文件存在且为目录
    -f file: 文件存在且为文件
    -e file: 文件存在
    -s file: 文件存在且大小不为0
    -r file: 文件存在且可读
    -w file: 文件存在且可写
    -x file: 文件存在且可执行
    -L file: 文件存在且为链接
    f1 -nt f2: 文件f1比f2新
    f1 -ot f2: 文件f1比f2老
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    C语言风格:

    ((1<2))
    (($a=0))
    
    • 1
    • 2

    12 条件语句

    
    # 可用;分割,也可以换行写入就不需要;
    if [ cond ]; then
    	command
    fi
    
    if [ cond ];then
    	command
    else
    	command
    fi
    
    if [ cond1 ];then
    	command
    elif [ cond2 ];then
    	command
    elif [ cond3 ];then
    	command
    else
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    13 并发控制

    使用$符让命令在后台执行

    for (( i=0; i<${count}; i++ ))
    do
    {
    	command
    }&
    done
    wait  # 需要加wait, 否则光标不结束不能回到terminal
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    14 并发等待

    使用wait控制

    for (( i=0; i<${count}; i++ ))
    do
    {
    	command
    }&
    done
    wait
    command
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    Android中常用Dialog的使用
    Matlab:变量名称
    分享篇:最近在研究的AIGC内容
    2020年亚太杯APMCM数学建模大赛A题激光标记舱口轮廓生成求解全过程文档及程序
    C#和Excel文件的读写交互
    HTTP协议
    第四章 将对象映射到 XML - 异常
    process information unavailable解决方案
    PHP自动识别采集何意网址文章正文内容
    Winform窗体开发:限制只能启动一个exe程序,禁止多开客户端。
  • 原文地址:https://blog.csdn.net/u012897374/article/details/126592708