• shell命令合集(loading)


    零、初试

    浅浅尝试:如何新建一个shell脚本?
    1、新建文件ln-test.sh
    2、输入脚本即可 #! 告诉系统用什么解释器来执行

    # !/bin/bash
    echo "Test"
    
    • 1
    • 2

    如何运行一个shell脚本?

    [root@rgcc0001.cn-rockydev-1 ~ ]# sh ln-test.sh
    Test
    
    • 1
    • 2

    一、命令合集

    1、echo命令

    echo命令:向窗口输出文本(前面例子提到)

    (1)显示字符串(普通字符串、转义字符

    [root@rgcc0001.cn-rockydev-1 ~ ]# echo "Here 'this is a string' is a string"
    Here 'this is a string' is a string
    [root@rgcc0001.cn-rockydev-1 ~ ]# echo "Here \"this is a string\" is a string"
    Here "this is a string" is a string
    
    • 1
    • 2
    • 3
    • 4

    (2)显示变量

    [root@rgcc0001.cn-rockydev-1 ~ ]# var=1
    [root@rgcc0001.cn-rockydev-1 ~ ]# echo "$var"
    1
    
    • 1
    • 2
    • 3

    (3)显示换行

    # -e 开启转义
    [root@rgcc0001.cn-rockydev-1 ~ ]# echo -e "OK! \n"
    OK! 
    
    
    • 1
    • 2
    • 3
    • 4

    (4)结果定向至文件

    [root@rgcc0001.cn-rockydev-1 ~ ]# echo "test" > ln.txt
    [root@rgcc0001.cn-rockydev-1 ~ ]# cat ln.txt 
    test
    
    • 1
    • 2
    • 3

    (5)显示命令执行结果

    # 反引号
    [root@rgcc0001.cn-rockydev-1 ~ ]# echo `ls ./`
    anaconda-ks.cfg a.txt final_test.sh git ln.txt
    
    • 1
    • 2
    • 3

    2、date命令

    date +%s 打印出自1970-01-01 00:00:00到当前时间的秒数
    date -d: 用string方式显示时间

    [root@rgcc0001.cn-rockydev-1 ~ ]# date
    Sat Nov 26 23:10:20 CST 2022
    [root@rgcc0001.cn-rockydev-1 ~ ]# date +%s 
    1669475435
    
    • 1
    • 2
    • 3
    • 4

    3、sed命令

    (1)对全局匹配上的所有字符串进行替换

    sed -i ‘s/替换前字符串/替换后字符串/g' test.txt
    
    • 1

    (2)对每行匹配到的第一个字符串进行替换

    sed -i ‘s/替换前字符串/替换后字符串/' test.txt
    
    • 1

    4、jq命令

    jq命令用来处理json文件
    centos下直接通过yum 安装 yum install jq -y

    [root@rgcc0001.cn-rockydev-1 ]# var1=$(jq .ports test.json)
    [root@rgcc0001.cn-rockydev-1 ]# echo $var1
    [ { "network_id": "9febed5b-bd48-4f00-9a73-4264ed803928", "name": "net_port_1" }, { "network_id": "9febed5b-bd48-4f00-9a73-4264ed803928", "name": "net_port_2" } ]
    
    
    • 1
    • 2
    • 3
    • 4

    port_sg.json内容如下:

    { "ports":
    [
        {
            "network_id": "9febed5b-bd48-4f00-9a73-4264ed803928",
            "name": "net_port_1"
        },
        {
            "network_id": "9febed5b-bd48-4f00-9a73-4264ed803928",
            "name": "net_port_2"
        }
    ]}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    5、cut命令

    6、/dev/null

    (1)作用:是一个垃圾站,不要的东西丢进去,用来清除文件中的内容

    [root@rgcc0001.cn-rockydev-1 ~ ]# ls >>a.txt # 将ls命令的结果输入到a.txt中
    [root@rgcc0001.cn-rockydev-1 ~ ]# cat a.txt
    anaconda-ks.cfg
    a.txt
    final_test.sh
    git
    [root@rgcc0001.cn-rockydev-1 ~ ]# cat /dev/null > a.txt #清空a.txt文件内容
    [root@rgcc0001.cn-rockydev-1 ~ ]# cat a.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (2)& > /dev/null
    让目前的信息不显示,就是把标准输出和错误输出重定向到/dev/null,程序不在屏幕上显示

    [root@rgcc0001.cn-rockydev-1 ~ ]# ll test
    ls: cannot access test: No such file or directory
    [root@rgcc0001.cn-rockydev-1 ~ ]# ll test &> /dev/null #屏幕不显示错误信息
    
    • 1
    • 2
    • 3

    7、basename命令

    打印目录/文件的基本名称

    [root@rgcc0001.cn-rockydev-1 sh_files ]# basename /root/sh_files/create_network.sh 
    create_network.sh
    
    • 1
    • 2

    二、关于变量

    1、变量的定义

    1.1 直接赋值给变量

    定义变量,变量名不加$,变量名和等号之间没有空格
    {}可选,为的是更好是别变量边界。
    使用变量时,变量名才加$

    [root@rgcc0001.cn-rockydev-1 ~ ]# cat ln-test.sh
    # !/bin/bash
    TEST="ln_test"
    echo ${TEST}
    echo $TEST
    [root@rgcc0001.cn-rockydev-1 ~ ]# sh ln-test.sh
    ln_test
    ln_test
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.2 语句赋值给变量

    用语句可以给变量赋值

    [root@rgcc0001.cn-rockydev-1 ~ ]# cat ln-test.sh 
    # !/bin/bash
    TEST=`ls /root/`
    echo ${TEST}
    echo $TEST
    [root@rgcc0001.cn-rockydev-1 ~ ]# sh ln-test.sh 
    anaconda-ks.cfg a.txt create_network.sh create_port_test.sh 
    anaconda-ks.cfg a.txt create_network.sh create_port_test.sh 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    该例将/root/下目录的文件名复制给变量TEST

    2、shell字符串

    2.1 单引号

    单引号里任何字符原样输出,忽略所有的命令以及特殊字符(不解析特殊字符)

    [root@rgcc0001.cn-rockydev-1 ~ ]# echo 'string'
    string
    [root@rgcc0001.cn-rockydev-1 ~ ]# echo 'ls ./'
    ls ./
    
    • 1
    • 2
    • 3
    • 4

    2.2 双引号

    双引号内可以有变量,可以有转义字符(会解析特殊字符,包括` $ \),如果要忽略特殊字符,可以用\来转义,作为普通字符来输出。

    [root@rgcc0001.cn-rockydev-1 ~ ]# var=1
    [root@rgcc0001.cn-rockydev-1 ~ ]# echo '$var'
    $var
    [root@rgcc0001.cn-rockydev-1 ~ ]# echo "$var"
    1
    # 如果想输出 $var
    [root@rgcc0001.cn-rockydev-1 ~ ]# echo "\$var"
    $var
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    [root@rgcc0001.cn-rockydev-1 ~ ]# cat ln-test.sh 
    # !/bin/bash
    TEST="ln_test"
    test1="test1,"$TEST" "
    test2="test2,"${TEST}" "
    echo $test1
    echo $test2
    [root@rgcc0001.cn-rockydev-1 ~ ]# sh ln-test.sh 
    test1,ln_test
    test2,ln_test
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    三、for循环和并发

    1、使用&,让命令在后台运行
    在命令末尾加上&
    2、再在done之后加上wait命令,该命令等待当前脚本进程下的子进程结束再运行后面语句

    NET_SEQ=2
    for i in `seq 1 $NET_SEQ`;
        do {
        openstack network create test_net_${i} &>/dev/null
        } &
        done
        wait
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    四、运算符

    1、算术运算符

    加减乘除,乘法前要加转义字符

    [root@rgcc0001.cn-rockydev-1 ~ ]# echo `expr $var1 + $var2`
    30
    [root@rgcc0001.cn-rockydev-1 ~ ]# echo `expr $var1 - $var2`
    -10
    [root@rgcc0001.cn-rockydev-1 ~ ]# echo `expr $var1 \* $var2`
    200
    [root@rgcc0001.cn-rockydev-1 ~ ]# echo `expr $var1 / $var2`
    0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2、关系运算符

    五、if语句

    八、问题记录

    1、如何避免for i in {0…$i}输出i异常?

    现象:

    [root@rgcc0001.cn-rockydev-1 ~ ]# cat ln-create.sh 
    NET_NUM=4
    # Creating networks and subnets
    for net_num in {0..$NET_NUM};
    do {
    echo net_num=$net_num;
    }
    done
    [root@rgcc0001.cn-rockydev-1 ~ ]# sh ln-create.sh 
    net_num={0..4}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    解决方案:

    [root@rgcc0001.cn-rockydev-1 ~ ]# cat ln-create.sh 
    # 修改该行即可
    for net_num in `seq 1 $NET_NUM`;
    ...
    [root@rgcc0001.cn-rockydev-1 ~ ]# sh ln-create.sh 
    net_num=1
    net_num=2
    net_num=3
    net_num=4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    OpenGL ES 学习初识(1)
    D. Bandit in a City(DFS + 叶子节点数目)
    Debian常用命令
    Leetcode1805-字符串中不同整数的数目
    MyBatis学习:使用占位符#
    SMC IRV系列手动真空调节器低压控制性能考核试验
    如何利用python来提取SQL语句中的表名称
    细分图中的可到达节点 : 常规最短路运用题
    怎样将文字转换成语音?这两种转换方法方便有效
    ACID事务理论
  • 原文地址:https://blog.csdn.net/linanali0606/article/details/127950432