zoukankan      html  css  js  c++  java
  • 一文快速入门Shell脚本_了解Shell脚本基本命令

    通过代码加注释的形式,列举了shell的基础操作,注释、变量、函数、循环等,帮助小白(像我一样)快速入门。用来练手的shell在线编辑器,别挑剔。屏幕右侧有个“胖胖”的目录,宽度小的放不下它,缩放一下页面就出来了。

    注释

    学语言,从注释开始。#!写在开头,用来指定shell程序的路径。单行用#号;多行::<<' 多行注释... ':<<a 多行注释... a:<<xx 多行注释... xx...。

    #! /bin/bash
    # 我是注释
    :<<'
    ...多行注释...
    '
    

    文件包含

    在一个脚本里加入另一个脚本。

    . pwdfile          #中间有个空格。pwdfile是脚本路径。
    source pwdfile     #同上。
    

    向脚本传参数

    在终端这样运行脚本:~/position.sh x y,x、y是两个参数,在脚本中可以获取参数信息。

    # ~/god.sh x y
    echo $0        #输出 god.sh脚本名,看作是第0个参数。
    echo $1        #输出 x,第1个参数。
    echo $2        #输出 y,第2个参数。
    echo $#        #输出 2,$#获得参数个数。
    # 获取第10个及之后的参数加大括号 ${10}。$号可以显示系统变量,往下看。
    

    变量

    shell中有用户变量、系统变量、环境变量。

    系统变量

    echo $#       # 程序参数个数。
    $?            # 上一个命令的返回值,正常为0,否则不为0。
    $n            # 执行脚本的第n个参数,$0代表脚本名,$1时第一个参数。
    $*            # 以"$1 $2 $3..."形式获取所有参数。
    $@            # 以"$1""$2""$3"...的形式获取所有参数。
    

    用户变量

    num=12345555     #定义变量。中间不能有空格。
    echo ${num}      #使用变量,用$号。
    echo $num        #简写方式。
    read num         #从标准输入给变量赋值。
    readonly num     #使变量只读,不可改变也不可删除。
    upset num        #删除变量。如果删除只读变量,运行时会出错。
    :<<'
    字符串变量
    '
    s='BA'                 #单引号包含。单引号中内容时固定的,加在里面的变量无效,写的啥就是啥。
    st='up,up,down,down,left,right,left,right,'${s} #可以在单引号外面加变量实现拼接。
    str="${st},awsl"       #双引号包含,中间可以加变量来拼接。str=上,上,下,下,左,右,左,右,BA,awsl。
    echo ${#str}           #中间加个#号获取字符串长度。此命令输出45。
    
    echo abcd"efg""             #转义了一个"号,输出abcdefg"。
    echo abcd"efg                #正确的错误示范,会报错。非转义的双引号当作定义字符串变量的标识,要成对出现,且不会显示。
    echo 'one${peace}"'          #输出one${peace}"。单引号内容固定,"号也会显示。单引号必须成对出现,转义的也不能单出来。
    

    环境变量

    名称 含义
    PATH 决定shell将到那些目录寻找命令和程序
    HOME 当前用户主目录路径
    LOGNAME 当前用户登陆名
    HISTSIZE 历史记录数
    HOSTNAME 主机名称
    SHELL shell路径
    LANGUGE 语言相关的环境变量
    MAIL 当前用户邮件存放路径
    PS1 主提示符,root用户是"#",普通用户是"$"
    PS2 辅助提示符,默认是">"
    TERM 终端类型
    PWD 当前工作目录的路径

    数组

    这只有一维数组。

    array=(huo ge "wo")     # 空格分开。
    array[3]=zi             # 下标从0开始,这里又添加了一个元素。
    echo ${array[3]}        # 输出zi。
    echo ${array[@]}        # 输出数组全部内容,huo ge wo zi 。*号可以代替@号。
    echo ${#array[@]}       # 输出4。数组的元素个数。
    

    函数

    函数定义后才能使用。函数包着多条命令,方便执行。

    cxk(){                 # 定义函数。
    echo "这只是个函数"
    return 2               # 可以返回0-255之间的数。省略时,返回最后一条命令的运行状态,正常为0。$?可以读取最后一条指令的返回状态,正常为0,可以利用$?获得return值。
    }
    cxk                    # 调用函数。
    cxk c t r l            # 调用函数时传递参数,用法和传入脚本的参数一样。
    

    if与比较

    if [ 4 -lt 5 ]            # -lt用来判断左侧数是否小于右则数。数和符号之间的空格不能省略。
    then                      # []中运算式是true时执行then,否则执行else。
    {
    echo "4小于5"
    echo "没错"
    }
    else                      # else后面没有命令的话,就不要写else。
    echo "4不就是小于5吗?"
    fi
                              # 也可以写成一行。
    if [ 4 -lt 5 ];then { echo "4小于5";echo "没错";};else echo "4不就是小于5吗?";fi
    # then和else之间可以加多个elif then,用法与if then相同。
    

    !布尔取非,-a布尔与运算(and),-o布尔或运算(or)。
    字符串的比较用=!=,另外,可以用参数-z、-n,比如[ -z $str ][ -n "buweiling" ],分别判断字符串长度是否为0长度是否不为0[ $str ],可以判断字符串变量str是否不为空。

    []内的运算用-o-eq等,看做是一条shell命令,[[]]内用>=&&||等运算符号进行条件判断。(())用来做数值的判断。

    比较符号:

    符号 含义
    -eq equal,左数是否等于右数
    -ne not equal,左数是否不等于右数
    -lt litter than,是否小于
    -gt greater than,是否大于
    -le litter、euqal,是否小于等于
    -ge greater、equal,是否大于等于

    test

    测试命令,测试条件真假,是[]的另一种形式,常与if和循环配合使用,可以做数字、字符、文件相关的判断。

    if test 4 -lt 5                # test 4 -lt 5和[ 4 -lt 5 ]一样。
    then echo "4小于5"
    fi
    

    测试文件。

    if test -e /home                # -e判断文件是否存在,下表列出了其他常用的符号。test -e /home和[ -e /home ]一样。
    then echo '文件已存在!'
    else echo '文件不存在!'
    fi
    

    一些常用的文件比较符号:

    符号 测试的文件含义
    -e 是否存在
    -r 是否存在且可读
    -w 是否存在且可写
    -x 是否存在且可执行
    -s 是否存在且有字符
    -d 是否存在且是目录
    -f 是否存在且是普通文件
    -c 是否存在且是字符型文件
    -b 是否存在且是块文件

    循环

    shell有for循环、while循环、until循环,格式和常用语言的格式有些差异。

    for cxk in c t r l
    do echo $cxk
    done
    
    for(( a=1; a < 5; a=`expr $a + 1 ` ))      # 反引号可以执行bash外的其他命令,expr可以计算表达式。for(( ; ; ))这样中间不加参数是无限循环。
    do echo $a
    done
    
    a=1
    while(( $a<=10 ))                          # (( $a<=10 ))和test $a -lt 10一样。while :和while true是无限循环。
    do 
    echo $a
    a=`expr $a + 1 `
    done
    
    a=1
    until [ $a -eq 5 ]                         # 条件是true时停止循环。[ $a -eq 5 ]和 test $a -eq 5 一样。
    do 
    echo $a
    a=`expr $a + 1 `
    done
    

    循环中可以使用breakcontinue

    case-in多选择

    love="can beat everything"
    case $love in                                         # case x in ... esac
    "a") echo a ;;                                        # )和;;是固定格式。
    "b") { echo b; } ;;
    "can beat everything") echo "love "$love ;;
    esac
    

    重定向

    shell可以将输入、输出进行重定向。
    Linux运行时会打开标准输入文件、标准输出文件、标准错误输出文件,也就是stdin、stdout、stderr,输入重定向指stdin的重定向,输出重定向指stdout的重定向。

    命令 说明
    command > file 将输出重定向到 file
    command < file 将输入重定向到 file
    command >> file 将输出以追加的方式重定向到 file
    n > file 将文件描述符为 n 的文件重定向到 file
    n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file
    n >& m 将输出文件 m 和 n 合并
    n <& m 将输入文件 m 和 n 合并
    << tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入

    表中文件描述m、n可以是0、1、2中的一个,分别代表stdin、stdout、stderr。


    参考

    • 《嵌入式Linux系统开发教程》姜先刚,袁祖刚-电子工业出版社,2016.8
  • 相关阅读:
    DOS命令行
    很好的GDAL初学者资料
    VC++工程文件
    C#操作word文档
    vue 如何不复用组件的 DOM All In One
    2021 最新 XBOX 打丧尸游戏 All In One
    gti gc All In One
    custom height drawer All In One
    Redux & React Hooks All In One
    StackOverflow sites All In One
  • 原文地址:https://www.cnblogs.com/foxer-z/p/12421789.html
Copyright © 2011-2022 走看看