zoukankan      html  css  js  c++  java
  • 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
    
    
  • 相关阅读:
    苹果一体机发射Wi-Fi
    iphone 屏蔽系统自动更新,消除设置上的小红点
    data parameter is nil 异常处理
    copy与mutableCopy的区别总结
    java axis2 webservice
    mysql 远程 ip访问
    mysql 存储过程小问题
    mysql游标错误
    is not writable or has an invalid setter method错误的解决
    Struts2中关于"There is no Action mapped for namespace / and action name"的总结
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/11196190.html
Copyright © 2011-2022 走看看