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. Enum 类型

    枚举类型(Enumerated Type) 什么是枚举? 枚举是一个被命名的整型常数的集合.在多种编程语言中都有使用(C/C++/c#/java等). 示例 public enum Size { S, ...

  2. P2215 [HAOI2007]上升序列 DP

    这个字典序海星 思路:\(DP\) 提交:4次 错因:刚开始把字典序理解错了,怒看题解一脸懵逼:后来往前跳的时候又没有管上升\(QwQ\)窝太菜了. 题解: 所谓的字典序是相对位置!!!而不是元素本身 ...

  3. [BJOI2019]排兵布阵 DP

    [BJOI2019]排兵布阵 DP 比较好想的DP,设\(dp[i][j]\)表示第\(i\)个城堡时,已派出\(j\)个士兵.决策时,贪心派出恰好严格大于某一玩家派出的数量的两倍(不然浪费).我们发 ...

  4. idea 启动 Error running 'XxGatewayApplication': Command line is too long. Shorten command line for XxGatewayApplication or also for Spring Boot default

    在idea workspace里 <component name="PropertiesComponent">标签下加入 <property name=" ...

  5. 关于lda算法的一个博客

    http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html

  6. Drainage Ditches (HDU - 1532)(最大流)

    HDU - 1532 题意:有m个点,n条管道,问从1到m最大能够同时通过的水量是多少? 题解:最大流模板题. #include <iostream> #include <algor ...

  7. Til the Cows Come Home ( POJ 2387) (简单最短路 Dijkstra)

    problem Bessie is out in the field and wants to get back to the barn to get as much sleep as possibl ...

  8. vue中父组件如何监听子组件值的变化

    vue中我们会遇到很多父子组件通信的需求, 下面简单列一下,父子组件通信的几种情况 1:父组件向子组件传值:使用prop向子组件传值: 2:子组件实时监听父组件传来的值的变化:使用watch去监听父组 ...

  9. 7.27T2

    不可做题 sol:首先有个很显然的性质就是答案一定是在叶子上最优,然后画画图发现就是从最底层看,如果一条链就看做一个点,向上的第一颗非链的节点,它的儿子数-1就会对答案贡献,所有这样的累加起来就是答案 ...

  10. Python WEB框架之Flask

    前言: Django:1个重武器,包含了web开发中常用的功能.组件的框架:(ORM.Session.Form.Admin.分页.中间件.信号.缓存.ContenType....): Tornado: ...