• shell 入门学习



    title: shell 入门学习
    date: 2019/7/16 15:47:49
    toc: true

    shell 入门学习

    linux c 一站式学习笔记

    https://ss64.com/bash/syntax.html

    注释

    使用#注释一行

    #!在第一行称为 Shebang,表示脚本解释器是什么,比如!# bin/bash

    执行与启动

    • 文件首行的!#不仅可以指定程序,还能指定参数#! /bin/sed -f,增加了这个shebang的脚本可以不用指定程序,直接使用./xxx.脚本执行

    • man bash-builtins 查看内建命令

    • 为什么需要内建命令?

      shell的外部命令流程是先fork出一个shell后执行exec执行命令,fork后返回会恢复父进程的上下文,所以诸如cd等命令就不能产生效果了

    • 内建命令使用 $?读出返回的状态

    • 命令行下输入的命令用()括号括起来,那么也会fork出一个子Shell执行小括号中的命令

    • 使用source xxx.sh或者. ./xxx.sh改变子进程,不会影响交互式(父)shell

    • 交互登录bash的环境变量顺序 搜索A *login shell* is one whose

      /etc/profile
      ~/.bash_profile, ~/.bash_login, and ~/.profile
      退出
      /etc/bash.bash_logout
      
    • 交互非登陆bash读取文件~/.bashrc,使用--norc禁用这个操作

    • 非交互启动bash,执行子命令的fork,由环境变量BASH_ENV决定, 它的值当作启动脚本的文件名

    • sh启动的bash,尽量模拟上述三种bash

      • 带有 --login,模拟交互登录bash的环境变量顺序,/etc/profile ~/.profile
      • 交互bash,展开变量if [ -n "$ENV" ]; then . "$ENV"; fi
      • 非交互Shell启动,例如#! /bin/sh,则不执行任何启动脚本

    变量

    • *匹配0或者任意个字符

    • ?匹配一个任意字符

    • [xxx],匹配方括号中任意一个字符的一次出现

    ` 和 $() 命令代换明显执行后计算结果复制变量

    
    - `$(())`变量转换为整数,只能做加减乘除的整数运算
    
    - 转义字符是`\`,shell输入时还表示换行继续
    
    - 创建带有`-`开头的文件`touch  -- -a.c`
    
    -    双引号用于保持引号内所有字符的字面值(回车也不例外),但以下情况除外:
    
       ```
    $加变量名可以取变量的值
    反引号仍表示命令替换
    $表示$的字面值
    \`表示`的字面值
    "表示"的字面值
    \表示的字面值
    除以上情况之外,在其它字符前面的无特殊含义,只表示字面值
    
    • $0 命令本身
      $1、 $2.. 参数
      $# 参数个数,不包括$0
      $@ 表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。
      $? 上一条命令的Exit Status
      $$ 当前Shell的进程号
      shift shift 3表示原来的$4现在变成$1,不带参数的shift命令相当于shift 1

    语法

    参考 /etc/init.d/下的脚本

    if
     then
    elif
     then
    else
    fi
    
    
    
    case $xxx in
    	a)
    		...
    	;;
    	b)
    		...
    	;;
    	*)
    esac
    
    for xxx in xxxx
    done
    
    while xxx;do
    	xxx
    done
    
    • true =0,false=1,这与c语言相反

    • 命令test[可以测试条件是否成立

    • $?是退出状态

    •   -eq(等于) -ne(不等于) 
        -lt(小于) -le(小于等于) 
        -gt(大于) -ge(大于等于)
      
    •   测试表达式的连接符号 
        ! 逻辑反
        -a 与
        -o 或
      
    • 作为一种好的Shell编程习惯,应该总是把变量取值放在双引号之中,比如"$VAR",p602 linuxc 一站式编程

    • 多个命令在一行用;隔开,一行一个命令不需要;

    • :是一个特殊的命令,称为空命令,该命令不做任何事,但Exit Status总是真

    • &&相当于“if...then...”,而||相当于if not...then...

    • $1shell中第一个参数,$0为命令自身,$#是参数个数,布包裹$0

    • 函数体的左花括号{和后面的命令之间必须有空格或换行,如果将最后一条命令和右花括号}写
      在同一行,命令末尾必须有;号,函数调用不写括号

    • mkdir $DIR > /dev/null 2>&1,这里先将标准输出重定位到null,然后标准错误输出也到标准输出,使用&的原因是这里是引用标准输出,不加引号的话就是1这个文件了

    调试

    -n 读取不执行.类似编译
    -v 一边执行,一遍打印标准错误
    -x 打印执行的每句话和结果

    使用

    $ sh -x ./script.sh
    
    #! /bin/sh -x
    
    脚本中设置,set -x和set +x分别表示启用和禁用-x参数,这样可以只对脚本中的某一段进行跟踪调试
    #! /bin/sh
    if [ -z "$1" ]; then
    set -x
    	echo "ERROR: Insufficient Args."
    exit 1
    set +x
    fi
    
    
  • 相关阅读:
    LeetCode 501. 二叉搜索树中的众数
    LeetCode 404.左叶子之和
    LeetCode 450. 删除二叉搜索树中的节点
    LeetCode 437. 路径总和 III
    LeetCode 429. N 叉树的层序遍历
    LeetCode 213. 打家劫舍 II
    LeetCode 337. 打家劫舍 III
    LeetCode 198. 打家劫舍
    LeetCode 235. 二叉搜索树的最近公共祖先
    LeetCode 230. 二叉搜索树中第K小的元素
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/11196190.html
Copyright © 2020-2023  润新知