美文网首页
linux shell 复习

linux shell 复习

作者: 吉凶以情迁 | 来源:发表于2022-09-08 11:30 被阅读0次
    {
        // See https://go.microsoft.com/fwlink/?LinkId=733558
        // for the documentation about the tasks.json format
        "version": "2.0.0",
        "tasks": [
            {
                "label": "compileRun",
                "type": "shell",
    
                "command": "sh ${file} a b c d e f",
                "args": [ //传递给命令的参数
                {
              "value": "",
                     "quoting": "escape" //指定对内容的escape
                }
            ],
               "presentation": {
                    "echo": false,//如果 为false,怎么执行命令是不会提示的,但是 程序里面的控制信息是会执行的.
                    "reveal": "always",
                    // "reveal": "never",//揭露 总是 显示信息不然搞毛.
                    "focus": false,
                    "panel": "shared",//面板就是每次启动的时候是否新开 dedicated专用 ,shared保留之前
                    "clear": true,//每次变异 是否清屏.
                    "showReuseMessage": false// 不是,true就提示enter,否则 还是需要按enter 就是提示那个英文而已但是并不会自动关闭
                },
                "group": {
                    "kind": "build",
                    "isDefault": true
                }
            }
        ]
    }
    
    

    sh.exe设置环境变量,一般电脑中都有这个程序。


    image.png

    快捷键

        {
            "key": "ctrl+b",
            "command": "workbench.action.tasks.runTask",
            "args": "compileRun"
        },
    

    测试代码

    
    
    #!/bin/sh
    #cut --help
    # cut -d 自定义分割富这里为;  -f 表示指定取出哪个区域
    A="1aaaa;2bbbb;3ccccc;4cccccc;5ddddd;6eeee;7fff;8ggggg;9h;10i;11j;12k;13l;14m;15n"
    echo "分割取出 第6个 和 第1到3个"
    echo $A | cut -d ';'  -f  6,1-3;      #1aaaa;2bbbb;3ccccc;6eeee
    echo "分割取出第三个"       #
    echo $A | cut -d ';'  -f  33ccccc
    echo "分割取出第3到5个"       #
    echo $A | cut -d ';'  -f  3-5       # 3ccccc;4cccccc;5ddddd
    echo "分割取出 第一个 第5到7个"
    echo $A | cut -d ';' -f 1,5-7 #1aaaa;5ddddd;6eeee;7fff
    
    if true; then #为了让下面的代码不执行测试上面的代码这里。
        exit;
    fi
    
    #逻辑分支
    echo aa
    if [ "aa" == "bb" ]; then
        echo "equal bb"
    else
        echo "no"
    fi
    #echo $PATH
    #ls -l /
    
    #find / -name "*.exe"
    #sh
    #curl http://baidu.com
    #定义数组
    a=(A B "C" D)
    echo $a
    echo $a[0]
    #switch判断
    ACTION="fff"
    case $ACTION in
    start)
        echo EXEC sTART
        ;;
    end)
        echo is end
        ;;
    *)
        echo is other
        ;;
    esac
    
    # [ -z "$2" ]  判断第几个参数是否为空的。如果第二个值为空,则执行...
    # [ -z "$1" ] 如果第一个值为空,则xxxx
    # [ -n "$2" ] 判断是否有"几个"参数。如果参数是两个的话,则执行...
    # [ $? -eq 0 ] 判断上条语句执行是否正确,如果正确则...
    # [ $# -eq 3 ] 位置参数是否为3,如果是3个则...
    
    # -e filename       如果filename存在,则为真
    # -d filename       如果filename为目录,则为真
    # -f filename       如果filename为常规文件,则为真
    # -L filename       如果filename为符号链接,则为真
    # -r filename       如果filename可读,则为真
    # -w filename       如果filename可写,则为真
    # -x filename       如果filename可执行,则为真
    # -s filename       如果文件长度不为0,则为真
    # -h filename       如果文件时软连接,则为真
    # filename1 -nt filename2       如果filename1比finame2新,则为真
    # filename1 -ot filename2       如果filename1比filename2旧,则为真
    
    # -eq       等于
    # -ne       不等于
    # -gt       大于
    # -ge       大于等于
    # -lt       小于
    # -le       小于等于
    
    # if [$string1 = $string2]      如果string1等于string2,则为真。字符串允许使用赋值号作为等号
    # if [$string1 != $string2]     如果string1不等于string2,则为真
    # if [-n $string]                   如果string非空(非0),返回0(true)
    # if [-z $string]                   如果string为空,则为真
    # if [$string]                  如果string非空,返回0(和-n类似)
    # if[!表达式]      条件表达式的相反
    # if[!-d$num]         如果不存在目录$num
    # if [表达式1 -a 表达式2]     条件表达式的并列 逻辑&&
    # if[表达式1 -o 表达式2]      条件表达式的或 逻辑||
    
    echo 进程pid:$$
    echo 后台运行的PID:$!
    ls xx
    echo 当前脚本上一行出错代码:$? 如上面输入ls xx 代码执行错误了,这里那么就不为0 为 2
    echo shell脚本传递过来的参数是 $@ 如执行 ./aa.sh a b c d 那么打印的是a b c d, # $@ 与$* 一样
    echo 参数总数$#
    echo 脚本名 $0
    echo 第一个参数 $1
    myarr=(A B "C" D)
    echo 数组总数${#myarr[@]}
    echo 数组总数${#myarr[*]}
    echo 数组全部打印${myarr[@]}
    echo 数组全部打印${myarr[*]}
    echo 第1个元素${myarr[0]}
    
    a=10
    b=20
    
    val=$(expr $a + $b)
    echo "计算a+b结果$val "
    val1=$(expr $a+$b)
    echo "a + b无空格隔开则是字符串拼接,结果是: $val1"
    echo -e "允许换行 \ n符号识别   \n"
    echo -e "aaa \c" # 让aaa后面的bb跟到aaa前面, 如果没有-e  和\c  每一个echo都会默认换行的。
    echo "bb"
    echo "cc"
    echo 时间$(date)
    
    num1=200
    num2=200
    if test $((num1)) -eq $((num2)); then
        echo '两个数相等!'
    else
        echo '两个数不相等!'
    fi
    num2=500
    
    if test $((num1)) -lt $((num2)); then
        echo "${num1}小于 ${num2}"
    else
        echo '不成立小于!' #如果单引号,则不支持变量引用
    fi
    num2=30
    if test $((num1)) -gt $((num2)); then
        echo "num1 ${num1}大于 num2${num2}"
    else
        echo "不成立大于!${num1}"
    fi
    
    # $$ Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
    # $! Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)
    # $? 最后运行的命令的结束代码(返回值),即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
    # $- 显示Shell使用的当前选项,与set命令功能相同
    # #∗ 和#@ 所 有 参 数 列 表
    # $# 参数个数数量
    # $0 就是编写的shell脚本本身的名字
    # $1 是在运行shell脚本传的第一个参数
    # $2 是在运行shell脚本传的第二个参数
    # $0 Shell本身的文件名
    # $1 ~ $n 添加到Shell的各参数值。$1是第1个参数,$2是第二个参数
    
    # 移动文件
    touch a.txt #创建空文件
    touch e.txt
    mv a.txt b.txt
    cp b.txt c.txt
    echo 当前文件txt内容
    ls -l *.txt
    mkdir aaa
    cd aaa
    touch aaa目录的文件.txt
    echo 目录aaa 信息
    cd ..
    ls -l aaa
    
    if test -d ./aaa; then
        echo 'aaa目录存在!'
    else
        echo 'aaa目录不存在'
    fi
    
    if [ -d ./aaa ]; then
        echo 'aaa目录存在使用[]语法!'
    else
        echo 'aaa目录不存在'
    fi
    
    rm -rf aaa #删除文件夹和内容
    echo 删除完毕内容
    # pwd# 当前目录 window sh不支持
    ls -l *.txt
    
    if test -e ./a.txt; then
        echo 'a文件存在!'
    else
        echo 'a文件不存在!'
    fi
    if test -e ./b.txt; then
        echo 'b文件存在!'
    else
        echo 'b文件不存在!'
    fi
    
    if test -f ./b.txt; then
        echo 'b文件存在 且为普通文件!'
    else
        echo 'b文件不存在!'
    fi
    
    ### 循环
    
    for a in 1 2 3 4 5; do
        echo "数组a当前 : $a"
    done
    
    C=(A B "C" D)
    # 打印数组变量的方法
    for temp in ${C[@]}; do
        echo "数组C当前 : $temp"
    done
    
    int=1
    while (($int <= 6)); do #这里固定2个括号
        echo $int
        # int++ #这种语法不支持
        let "int++"
    done
    
    echo "输入一个数:"
    num=22
    start=10
    start=10
    # read num
    for ((i = start; i <= $num; i++)); do
        for ((j = 1; j <= $num; j++)); do
            [ $j -le $i ] && printf "%d*%d=%-3d  " ${i} ${j} $((i * j)) #判断j是否小于i,当
            # [ $j -le $i ] && echo -n "${i}*${j}=$((i * j))    " #判断j是否小于i,当
        done
        echo "" #输出一个换行符
    done
    
    a=0
    
    if [ $a -lt 6 ]; then
        echo "$a小于6"
    else
        echo "$a 不小于6"
    fi
    # 这里要加上! 取反才能 成立,懵逼
    until [ ! $a -lt 6 ]; do
        echo $a
        a=$(expr $a + 1)
    done
    aNum=7 #测试的时候屏蔽这句话 允许read aNum 这句话
    while :; do
        echo -n "输入 1 到 5 之间的数字: "
        # read aNum
        case $aNum in
        1 | 2 | 3 | 4 | 5)
            echo "你输入的数字为 $aNum!"
            ;;
        7)
            echo "跳出循环"
            break
            ;;
        *)
            echo "你输入的数字不是 1 到 5 之间的! 你输入的是 $aNum 输入7跳出循环"
            continue
            echo "游戏结束" #本句话不会执行会重新走一遍逻辑
            ;;
        esac
    done
    
    myfunc() {
    
        echo "这是myfunction"
    }
    myfunc #执行函数
    
    # printf "请输入十个数字:用空格隔开 "
    # read
    # echo "打印输入的$REPLY"
    
    # biggest=$(echo "$REPLY" | tr ' ' '\n' | sort -rn | head -n1)
    # smallest=$(echo "$REPLY" |  tr ' ' '\n' | sort -rn | tail -n1)
    # echo "最大的数字为:  $biggest"
    # echo "最小的数字为:  $smallest"
    #函数取返回值
    returnFunc() {
        return 333
    }
    returnFunc
    echo "返回值是 $? !"
    
    returnFun() {
        echo 333
    }
    bbb=$(returnFun)
    echo "取echo值 $bbb"
    
    paramFunc() {
        echo "参数1 $1 参数2 $2 参数个数$# "
    }
    paramResult=$(paramFunc "334" "bb")
    
    echo "取带参数函数echo值 $paramResult"
    
    # 声明函数,用来获取 shell 脚本的绝对路径
    function get_script_path() {
        # 获取脚本文件的父路径
        local script_path=$(
            cd $(dirname $0)
            pwd
        )
        echo "父路径 $script_path" #貌似和直接 用 $(dirname $0) 本身没啥区别
        # 获取脚本名
        local script_name=$(basename $0)
        # 返回脚本的绝对路径
        echo "$script_path/$script_name"
    }
    
    # 调用函数,使用命令替换 $() 获取函数的返回值
    path=$(get_script_path)
    echo "当前脚本的绝对路径为:$path"
    
    echo path:$(dirname $0)
    echo 脚本名:$(basename $0)
    pwd #获取当前目录
    # cat 可以抓取临时文件也可以直接这样打印出来 多行
    cat <<EOF
        你的
        我的
        都是好的
        黄瓜是最好的
        
    EOF
    echo over
    #打印有几行
    wc -l <<EOF
       第一行
       第二韩
       方法
    EOF
    echo "ff" >/dev/null #你能看到打印的东西就见鬼了
    # https://zhuanlan.zhihu.com/p/418357041
    
    
    
    

    相关文章

      网友评论

          本文标题:linux shell 复习

          本文链接:https://www.haomeiwen.com/subject/pzbgnrtx.html