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

shell 入门学习的更多相关文章

  1. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  2. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  3. git入门学习(一):github for windows上传本地项目到github

    Git是目前最先进的分布式版本控制系统,作为一个程序员,我们需要掌握其用法.Github发布了Github for Windows 则大大降低了学习成本和使用难度,他甚至比SVN都简单. 一.首先在g ...

  4. Shell 脚本学习资料搜集

    Shell文档 ChinaUnix上大神“網中人”总结的Shell十三问,强烈推荐,这本书讲得比较精炼,而且都是一些Shell学习中容易把握不住的一些细节难点.每一问都写得非常精彩.ChinaUnix ...

  5. Shell简易学习练习

    1.Linux Shell入门 Quiz 1 一个接受命令行参数的shell脚本 任务 编写一个shell脚本1.sh,这个脚本接受一个命令行参数,并把这个参数打印两次到标准输出. 如果输入没有参数输 ...

  6. 转 shell脚本学习指南

    shell脚本学习指南 以下八点不敢说就能成为你shell脚本学习指南de全部,至少可以让你编写出可靠的shell脚本. 1. 指定bashshell 脚本的第一行,#!之后应该是什么?如果拿这个问题 ...

  7. VBox&vmware虚拟机安装Linux及Linux基础入门学习

    VBox&vmware虚拟机安装Linux及Linux基础入门学习 通过VMware workstation安装Linux 在安装虚拟机之前,我特意上网搜索了一下目前常使用的虚拟机软件,了解了 ...

  8. 【数据库】7.0 MySQL入门学习(七)——MySQL基本指令:帮助、清除输入、查询等

    1.0 help == ? 帮助指令,查询某个指令的解释.用法.说明等.详情参考博文: [数据库]6.0 MySQL入门学习(六)——MySQL启动与停止.官方手册.文档查询 https://www. ...

  9. 【数据库】4.0 MySQL入门学习(四)——linux系统环境下MySQL安装

    1.0 我的操作系统是CentOS Linux release 7.6.1810  (Core) 系统详细信息如下: Linux version 3.10.0-957.1.3.el7.x86_64 ( ...

随机推荐

  1. Vue之合理划分容器组件与展示组件

    Vue之合理划分容器组件与展示组件 时间 2019-06-02 00:30:32  Poetry's Blog 原文  http://blog.poetries.top/2019/06/01/vue- ...

  2. JS对象-不可扩展对象、密封对象、冻结对象

    不可扩展对象 Object.preventExtensions() 仅阻止添加自身的属性.但属性仍然可以添加到对象原型. 可以用 Object.isExtensible(obj) 来判断对象是否可扩展 ...

  3. Flask-第三方插件

    Flask-Session 因为flask自带的session是将session存在cookie中: 所以才有了第三方Flask_session插件,可以将session存储在我们想存储的数据库中(r ...

  4. c++ 容器切片反转次序(不拷贝到新容器)

    // rotate algorithm example #include <iostream> // cout #include <algorithm> // rotate # ...

  5. classpath详解

    在dos下编译java程序,就要用到classpath这个概念,尤其是在没有设置环境变量的时候.classpath就是存放.class等编译后文件的路径. javac:如果当前你要编译的java文件中 ...

  6. puppeteer学习笔记合集

    官方英文版API入口(如果你英文好的话):https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md. 汉化版API入口(网上有 ...

  7. Mac 下 brew的卸载 插件

    brew 又叫 Homebrew,是 Mac OSX 上的软件包管理工具,能在 Mac 命令行中方便的安装软件或者卸载软件, 只需要一个命令, 非常方便 brew 类似 ubuntu 系统下的 apt ...

  8. zookeeper系列 (第三章 :zookeeper 的使用)

    接上一章,在启动客户端之后,开始通过命令操作zookeeper 服务. 一:zookeeper 的基础命令 1.通过zkCli.sh 命令与主机建立一个会话 2.开始在会话中执行命令:写入Znode. ...

  9. Jmeter-app接口

    1.IOS登录接口涉及的三个接口: 2.三个接口传入的参,第三个是判断用户是否登录成功的 http://118.178.247.67:8449/service/userLogin/phoneQuick ...

  10. Android 显示系统:Vsync机制

    一.Vsync简介: 屏幕的刷新过程是每一行从左到右(行刷新,水平刷新,Horizontal Scanning),从上到下(屏幕刷新,垂直刷新,Vertical Scanning).当整个屏幕刷新完毕 ...