Shell

Shell,第1张

前言

          学习 shell 内容!

文章目录
  • 前言
  • 一、作用
  • 二、变量
    • 1. 定义
    • 2. 注释
    • 3. 取变量中的值
    • 4. 只读变量
    • 5. 删除变量
    • 6. 字符串
  • 三、默认变量
  • 四、数组
    • 1. 定义
    • 2. 取数组中元素的值
    • 3. 读取整个数组
    • 4. 取数组长度
  • 五、expr
  • 六、read
  • 七、echo
  • 八、printf
  • 九、test 与 [ ]
    • && 和 ||
    • test 命令
    • [ ] 命令
  • 十、判断
  • 十一、循环
    • 范围型遍历
    • 数值型遍历
    • 死循环处理
  • 十二、函数
  • 十三、exit
  • 十四、文件重定向
  • 十五、引入外部脚本

一、作用
  1. shell 是我们通过命令行与 *** 作系统沟通的语言
  2. 执行
    • 可以在终端命令行中执行
    • 将 shell 命令组成一个文件(脚本),方便复用
    • 在终端执行 bash filename ,或者将 shell 命令写在一个文件夹中 ./filename 文件要具有可执行的权限,执行的时候路径可以绝对路径也可以是相对路径
二、变量 1. 定义

shell 中的变量本质上都是字符串

name1='yjx'  # 单引号定义字符串
name2="yjx"  # 双引号定义字符串
name3=yjx    # 也可以不加引号,同样表示字符串
2. 注释

注释用 #

3. 取变量中的值

需要加上$符号,或者${}符号。花括号是可选的,主要为了帮助解释器识别变量边界。

name="yjx"
echo $name
echo ${name}
4. 只读变量

readonly 或者 declare 修饰可以将变量变为只读。

5. 删除变量

使用 unset 删除一个变量之后这个变量就不存在了,值为空字符串

name=yjx
unset name
6. 字符串
  1. 定义:字符串可以用单引号,也可以用双引号,也可以不用引号。单引号中的内容不好能转义( \ ),不能读取变量,不能执行;双引号中的内容可以转义( \ ),可以读取变量,可以执行。

  2. 获取字符串长度

name="yjx"
echo ${#name}  # 输出3
  1. 提取子串
name="hello, yxc"
echo ${name:0:5}  # 提取从0开始的5个字符
三、默认变量

设置好的特殊变量,可以拿来直接用

  1. :执行的文件名(包含路径),:命令行后的第一参数,$#:命令行后的第二参数


  1. $*:取长度(参数)," ":以字符串的形式返回所有的参数(由所有参数构成的用空格隔开的字符串,如上例中值为 $@),"" "" "" "" 每个参数分别用双引号括起来的字符串,如上例中值为 $?

  2. 上一条命令的退出状态exit codereturn 0)。一个进程 exit code 表示正常退出,其他值表示错误,其中 0 和 其他值就是退出状态即 命令的标准输出 stdout

  3. 0

四、数组

类似于 js 中数组的用法,数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小,数组下标从 # 方式 1 开始,下标可跳。

1. 定义
array
=(1"def" abc ) yjx# 每个数组元素用空格隔开:array[0]=1,array[1]=abc ... # 方式 2:直接定义数组中某个元素的值
[
array0]=1[
array1]=[abc
array2]="def"[
array3]=$()yjx
2. 取数组中元素的值

注意:${}:是获取 stdout 的值,[:是获取变量的值

${array]indexarray}
=(1"def" abc ) yjxecho
[ ${array]0echo}
[ ${array]1echo}
[ ${array]2echo}
[ ${array]3@ 和 *}
3. 读取整个数组

#:取所有

${[array]@# 第一种写法}  #
${[array]*# 第二种写法}  $#
4. 取数组长度

array :取长度,长度不是按下标来算,而是按照实际用到的下标数量来算

=(1"def" abc ) yjxecho

# ${[array]@# 第一种写法}  echo
# ${[array]*# 第二种写法}  作运算

五、expr
  1. 作用:用于exprbash中不可直接作运算,作运算时需要借助 expr 命令。stdout 将运算的结果返回到 $() 中,取运算结果时需要用 `` 或者 expr 表达式

  2. 格式:

  3. 用空格隔开每一项(一个命令后面的所有参数都需要用空格隔开)
  4. ,表达式的说明如下

    • 表达式说明

      • 对包含空格和其他特殊字符的变量要用引号括起来,避免报错
      • expr会在stdout中输出结果。如果为逻辑关系表达式,则结果为真,stdout为1,否则为0。
      • expr的exit code:如果为逻辑关系表达式,则结果为真,exit code为0,否则为1。
      • + - * / ()
    • 表达式为字符串表达式

    • 表达式为整数表达式

      • 支持 *,其中 ()\ 需要用 | 进行转义
      • 优先级:字符串表达式 > 这整数表达式 > 逻辑表达式
    • 表达式为逻辑表达式

      • &a | b,等价于 C++ 中的 || 和 &&,使用时需要转义

        • 如果 a 是非空或非0时,返回 a 的值,b 不计算。
          • 如果 a 是 0 或 空字符串,b 不为 0 或空则返回 b 的值,b 也同时为 0 或空则返回 0
          • a & b
        • 如果 a 是 0 或者空时,返回 0 或 空,b 不计算
          • 如果 a 不是 0 或非空时,b 为 0 或空时返回 0,b 不为 0 或空则返回 a 的值
          • 比较两端的参数,如果为true,则返回1,否则返回0
      • < <= == != >= >

          \
        • 需要转义,可以用 ' '()

      • 字符串 可以该表优先级,但需要用反斜杠转义

六、read

读取单行数据到某个变量里

七、echo

用于输出“”,注意:''""'' 可以读取字符串变量、进行转义,

  • && 和 || 是 bash 中自带的逻辑运算符,用法和 C++ 中的类似。 & 和 | 是 expr 命令中自己定义的
  • 不可以

    八、printf

    用于格式化输出,用法类似于 C/C++

    九、test 与 [ ] && 和 ||
    1. 命令串联 *** 作:a && b || c
    2. 用短路原则实现 if-else 的作用
        a && b
      • a || b:a 为假时,忽略 b;a 为真时,执行 b
      • 判断文件类型:a 为真时,忽略 b;a 为假时,执行 b
    test 命令
    1. 作用:用于比较两个元素(整数和字符串)值以及exit code
    2. test 命令用 0 返回结果, 表示非0 表示exit code。获取 $? 的值用
    3. 用进程状态表示结果,0 表示真,1 为假;用输出表示结果,1 为真,0 为假
    4. (查看上一条命令的退出状态)命令
    test 表达式
    表示结果expr
    stdout1表示真,0表示假test
    exit code0表示真,1表示假

    test 和 expr 的功能有重合:可以判断一个表达式是否为真,格式为 $?,看结果用 test 参数 filename,下面几个为具体类型的 *** 作。

    1. 文件类型判断,文件权限判断
           格式:test ,参数:-r -w -x -s
    # 判断文件是否可读 -r filename  test $a 参数 $b
    
    1. 整数间的比较
      格式:test ,参数:-eq -ne -gt -lt -ge -le
    $a $b -eq # a是否等于b  [
    $a $b -eq ] 
  • 字符串间的比较
    1. [ ]
    [ ] 命令
    1. [ ] 命令可以替代 test 命令
    2. $ 是一个命令,所以括号中的每个参数都要用空格隔开,括号内取变量值的时候最好将 "" 和变量一同用 if 括起来
    十、判断
    1. 单层 if
    then 表达式
    .. 
    	语句1
    	语句2
    	fi.
    if - else
    
    1. 单层 if
    then condition
    ..
        语句1
        语句2
        else.
    ..
        语句1
        语句2
        fi.
    if-elif-elif-else
    
    1. 多层 if
    then condition
    ..
        语句1
        语句2
        elif.
    then condition
    ..
        语句1
        语句2
        elif.
    then condition
    else
        语句1
        语句2
    #最后的 else 可省	..
        语句1
        语句2
        fi.
    for ... in ... do ... done ...
    

    十一、循环 范围型遍历

  • 形式 1
  • (do 和 done 类似于 C++ 中的左括号和右括号)

      #var 为变量,val1 val2 val3 分别为值1 值2 和值3(属于一个范围),var 会枚举范围里的每一个值,对于每一个值都进行一个循环
    for
    var in #  val1 val2 val3 do
    ..
        语句1
        语句2
        done.
    
  • 形式 2
    1. # seq a b 会返回一个从 a 到 b 的序列,每个用回车隔开
    for
    i in $( seq1 10 )do 
    echo
        $i done
    {1..20}
    
    1. 形式 3
      bash 中自带的一个范围遍历 {a..z} for
    i in 1 {..20}do
    echo
        $i done
    for
    
    数值型遍历

    类似于 C++,格式如下

    (( ;expression; condition)) expressiondo
    done
        语句1
        语句2
    for
    
    (( =int i 1 ;<= i 10 ;++ i )) # 括号里面可以加空格 do
    echo 
    	$i done
    ctrl + q
    
    死循环处理
    1. 结束一个进程用 q 或者 ps aux
    2. top:显示当前打开的所有进程,或者 PID(shift + m 按内存排序显示)查看进程 kill -9 PID
    3. 定义
    4. 即可杀掉此进程
    十二、函数
      func_name
    ().. { 
        语句1
        语句2
        }.
    ()
    
    1. 调用
      直接写函数名即可,不用加

    2. 向函数传参数
    3. 函数参数

      • 函数中获取命令参数, 第一个参数,文件名 第二个参数,依次类推,echo 表示stdout并不是函数名
    4. return:返回的是退出状态(exit code),0 表示函数正常结束,非 0 表示不是正常退出,不写 return 默认返回 0

    5. 函数的输出内容或者返回内容通过在函数中使用 $(函数名) 将内容返回到

    6. 用于退出当前进程
    7. 中,然后通过 $? 获取函数的输出内容或者返回值

    十三、exit
    1. 重定向:从终端输入改为从文件输入,输出到终端里改为输出到文件里
    2. 并返回一个退出状态,0 表示正常退出,1 表示失败,用
    3. 进程:每一个程序在执行的过程中都是一个独立的进程
    4. 来获取退出状态
    十四、文件重定向
      stdinstdout
    1. 在 Linux 中每一个进程在执行时都会默认打开 stderr(标准输入,从终端读取数据,文件描述符为0)、id(标准输出,向终端输出数据,文件描述符为1)、source (准错误输出,向命令行输出数据,文件描述符为2)这三个文件,文件描述符即文件的一个 .
    2. >文件名:覆盖,>>文件名:向文件里追加内容
    十五、引入外部脚本

    引入外部脚本类似于 C++ 中的 includ 头文件,关键字为 source 或者 ,引入的外部脚本无需有可执行权限具有可读权限即可

     filename
    .filename
    

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/langs/1323441.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-06-12
    下一篇 2022-06-12

    发表评论

    登录后才能评论

    评论列表(0条)

    保存