1. Linux shell脚本编程:
  2. 守护进程,服务进程:启动?开机时自动启动:
  3. 交互式进程:shell应用程序
  4.  
  5. 广义:GUI,CLI
  6. GUI:
  7. CLI:
  8. 词法分析:命令,选项,参数
  9. 内建命令:
  10. 外部命令:PATH
  11. fork()创建为一个进程:
  12.  
  13. 把要运行的一系列命令,写在文件中:
  14. 脚本或程序源文件:文本文件
  15. 两种方式:
  16. 编译执行:预处理---->编译---->汇编---->链接:事先完成,结果:二进制程序文件
  17. C,C++
  18. 解释执行:由解释器全程参与运行过程,每次读取一行,运行一行;
  19. Python:程序库
  20. 程序控制结构:调用编程库完成编程编写;
  21. 库文件:功能模块,在编程中可调用;通过其API:应用编程接口;
  22. Bash:程序
  23. 程序控制结构,调用机器上命令程序文件进行编程编写;
  24. 外部命令:各应用程序提供;
  25. 程序:指令+数据
  26. 算法+数据结构
  27.  
  28. 过程式编程:以指令为中心,设计算法,数据服务于算法;
  29. 对象式编程:以数据为中心,设计数据结构(类),程序服务于数据结构;
  30.  
  31. bash过程式编程:
  32. 顺序执行:逐个执行
  33. 选择执行:只执行其中一个分支
  34. 循坏执行:一段代码要执行0,1或多遍
  35.  
  36. 编程元素:变量、流程、函数
  37.  
  38. 变量:可变化的量,命名内存空间
  39.  
  40. bash环境:
  41. 本地变量:当前shell进程;
  42. 环境变量:当前shell进程及其子进程;
  43. 局部变量:某个函数执行过程;
  44. 位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数;
  45. 特殊变量:$?,$*,$@,$#,$$
  46.  
  47. 变量类型:
  48. 数值,字符:
  49.  
  50. 数值:
  51. 整数
  52. 浮点数
  53. 字符:
  54. ASCII
  55. 120:
  56. 字符:1, 2 , 0
  57. 数值:120 --->
  58.  
  59. 变量类型的作用:
  60. 存储空间
  61. 运算格式
  62.  
  63. 语言对变量类型的支持力度:
  64. 强类型:
  65. 弱类型:变量类型不严格区分;
  66. 默认存储机制:bash为字符
  67.  
  68. bash的变量使用特点:弱类型、无需事先说明;
  69.  
  70. 本地变量:
  71. name=value
  72. name:变量名
  73. =:赋值符号
  74. value:值
  75.  
  76. 变量名:只能包含数字、字母和下划线:且不能以数字开头;
  77. 引用变量:${name},name
  78. 例:
  79. [root@localhost ~]# animal="panao"
  80. [root@localhost ~]# echo ${animal}
  81. panao
  82. 引用:
  83. 弱引用:"",其内部的变量引用会替换为变量值;
  84. 强引用:'',其内部的变量引用会保持原有字符;
  85. 命令引用:`COMMAND`,$(COMMAND),引用命令的执行结果;
  86.  
  87. 声明为整型:
  88. declare -i name[=value]
  89. let name=value
  90.  
  91. 生命周期:
  92. 创建
  93. 销毁:
  94. 自动销毁:shell进程终止;
  95. 手动销毁:unset name
  96. 例:
  97. [root@localhost ~]# unset animal
  98.  
  99. 环境变量:
  100. "导出"的本地变量
  101. export name[=value]
  102. declare -x name[=value]
  103.  
  104. 查看所有环境变量:env,printenv,export
  105.  
  106. 销毁:
  107. unset name
  108.  
  109. 脚本:文本文件
  110. 运行脚本:事实上是运行一个bash进程,此进程负责从脚本文件中读取一个执行逻辑,而后有bash进程负责解析并运行此逻辑;
  111. 启动脚本:
  112. (1) #bash /PATH/TO/SCRIPT_FILE
  113. (2)一个执行权限,
  114. # ./PATH/TO/SCRIPT_FILE
  115.  
  116. shebang
  117. #!/bin/bash
  118.  
  119. 第一行:顶格给出shebang
  120. 注释行:#
  121.  
  122. bash的常用选项:
  123. -n:检查脚本中的语法错误;
  124. -x:调试执行脚本;
  125.  
  126. 命令的状态结果:
  127. bash进程用于追踪执行的命令成功与否的状态;
  128. 0:成功
  129. 1-222:失败
  130.  
  131. 特殊变量:
  132. $?:上一条命令的执行状态结果;
  133. 例:
  134. [root@localhost bin]# echo $?
  135. 0 // 0表示成功
  136.  
  137. 布尔型:
  138. "真":成功
  139. "假":失败
  140.  
  141. 自定义脚本的状态结果:
  142. exit[n]
  143.  
  144. 注意:脚本中任何位置执行了exit命令即会终止当前shell进程;
  145.  
  146. 条件测试:
  147. 界定程序执行环境:
  148.  
  149. (1)根据运行的命令的状态结果;
  150. (2)测试表达式
  151. test EXPRESSION
  152. [ EXPRESSION ] //括号两边必须有空格
  153. [[ EXPRESSION ]] //括号两边必须有空格
  154.  
  155. 整数测试:隐含着做数值大小比较,所以不要给变量引用加引用;
  156. $A -gt $B:是否大于:是则为"真",否则为"假";
  157. $A -ge $B:是否大于等于;
  158. $A -lt $B:是否小于;
  159. $A -le $B:是否小于等于;
  160. $A -eq $B:是否等于;
  161. $A -ne $B:是否不等于;
  162. 字符串测试:ASCII数值越大,字符比较时其值越大
  163. "$A" > "$B":是否大于;
  164. "$A" < "$B":是否小于;
  165. "$A" == "$B":是否等于;
  166. "$A" != "$B":是否不等于;
  167. -z "$A":是否为空;空则为"真",否则为"假"
  168. -n "$A":是否不空;不空则为"真",空则为"假"
  169.  
  170. 注意:应该使用[[ EXPRESSION ]]
  171.  
  172. 文件测试:测试文件的存在性以及属性;
  173. -e $file:是否存在,存在则为"真",否则为"假"
  174. -a $file:同上
  175. -f $file:文件是否存在且为普通文件;
  176. -d $file:文件是否存在且为目录;
  177. -h $file:是否存在且为符号链接文件;
  178. -L $file:同上;
  179. -b $file:是否存在且为块设备文件;
  180. -c $file:是否存在且为字符设备文件;
  181. -S $file:是否存在且为套接字文件;
  182. -p $file:是否存在且为管道文件;
  183.  
  184. -r $file:当前用户对文件是否拥有读权限;
  185. -w $file:当前用户对文件是否拥有写权限;
  186. -x $file:当前用户对文件是否拥有执行权限;
  187.  
  188. -u $file:文件是否拥有SUID权限;
  189. -g $file:文件是否拥有SGID权限;
  190. -k $file:文件是否拥有sticky权限;
  191.  
  192. -O $file:当前用户是否为指定文件的属主;
  193. -G $file:当前用户是否为指定文件的属组;
  194.  
  195. 双目操作符:
  196. $file1 -nt $file2:file1是否新于file2,file1的最近一次的修改时间是否晚于file2的;
  197. $file1 -ot $file2:file1是否旧于file2,file1的最近一次的修改时间是否早于file2的;
  198. $file1 -ef $file2:file1file2是否指向了同一个inode:测试二者是否为同一个文件的硬链接;
  199.  
  200. 特殊设备:
  201. /dev/null:空,bit buckets,吞下所有数据,并直接丢弃;
  202. /dev/zero:突出一堆0:
  203.  
  204. bash之条件判断(选择执行):
  205. if/then,case
  206.  
  207. if CONDITTION;then
  208. if-true-分支
  209. fi
  210.  
  211. if CONDITTION;then
  212. if-true-分支
  213. else
  214. if-false-分支
  215.  
  216. !CONDITTION:取反
  217.  
  218. 练习:写一个脚本
  219. 如果其路径不存在,则将其创建为目录,否则显示其存在,并显示内容类型;
  220.  
  221. #!/bin/bash
  222. #
  223. filename="/tmp/x/y/z/testdir"
  224. if [ -e $filename ];then
  225. echo "$filename exists."
  226. file $filename
  227. else
  228. mkdir -p $filename
  229. fi
  230. ~
  231. ~
  232. 脚本参数(位置参数变量):
  233. ./script.sh /etc/fstab /etc/grub2.cfg
  234. $0 $1 $2
  235.  
  236. 位置参数变量:$1,$2,....
  237. ${10}
  238.  
  239. 特殊变量:
  240. $?:命令的状态结果;
  241. $#:传递给脚本或函数的参数个数;
  242. $*和$@:引用传递给脚本或函数的参数列表;
  243.  
  244. shift:[n]:轮替
  245.  
  246. 与用户交互:
  247. read命令:
  248. read [option] VAR...
  249. -p "PROMPT"
  250. -t timeout
  251. 示例:
  252.  
  253. #!/bin/bash
  254. #
  255.  
  256. read -p "Plz enter a username: " -t 5 username
  257.  
  258. if [ -z "$username" ]; then
  259. username="myuser"
  260. fi
  261.  
  262. if id $username &> /dev/null; then
  263. echo "$username exists."
  264. else
  265. useradd $username
  266. fi
  267.  
  268. 命令引用:
  269. `COMMAND`,$(COMMAND)
  270.  
  271. 引用命令的执行结果:
  272. (1)ls `which cat`
  273. (2)lines=$(wc -l /etc/fstab | cut -d '' -f1)
  274.  
  275. #!/bin/bash
  276. #
  277. if [ -f $1 ]; then
  278. lines=$(wc -l $1 | cut -d' ' -f1)
  279. echo "$1 has $lines lines."
  280. else
  281. echo "$1 not exists or not a file."
  282. fi
  283.  
  284. 练习:写一个脚本,完成如下功能:
  285. 判断给定的两个数值,孰大孰小;
  286. 给定数值的方法:脚本参数,命令交互;
  287. 代码如下:
  288.  
  289. 1 #!/bin/bash
  290. 2 #
  291. 3 read -p "Plz enter two integer: " -t 10 num1 num2
  292. 4
  293. 5 if [ -z "$num1" ];then
  294. 6 echo "Plz give two integers."
  295. 7 exit 1
  296. 8 fi
  297. 9
  298. 10 if [ -z "$num2" ];then
  299. 11 echo "Plz give two integers."
  300. 12 exit 1
  301. 13 fi
  302. 14
  303. 15 if [$num1 -ge $num2 ];then
  304. 16 echo "Max: $num1,Min;$num2."
  305. 17 else
  306. 18 echo "Max:$num2,Min:$num1."
  307. 19 fi
  308. 循环语句:
  309. for,while,until
  310.  
  311. 循环:将循坏体代码执行01或多次;
  312. 进入条件:进入循环的条件;
  313. 退出条件:循环终止的条件;
  314.  
  315. for VARIABLE in LIST;do
  316. 循环体
  317. done
  318.  
  319. LIST:是由一个或多个空格分隔开的字符串组成;
  320. 把列表的每个字符串逐个赋值给VARIABLE表示的变量;
  321.  
  322. for username in user1 user2 user3;do
  323. 循环体
  324. done
  325.  
  326. 进入条件:列表非空
  327. 退出条件:列表遍历结束;
  328.  
  329. 添加5个用户:
  330. #!/bin/bash
  331. #
  332. for username in user1 user2 user3 user4 user5; do
  333. if id $username &> /dev/null; then
  334. echo "$username exists."
  335. else
  336. useradd $username
  337. echo "Add user $username finished."
  338. fi
  339. done
  340. LIST的生成方法:
  341. (1)整数列表
  342. a){start..end}
  343. (b)$(seq start [[step]end])
  344. (2)直接给出
  345. (3)glob
  346. (4)根据命令生成
  347.  
  348. 示例:数值列表
  349. #!/bin/bash
  350. #
  351. for i in {1..10}; do
  352. if id user$i &> /dev/null; then
  353. echo "user$i exists."
  354. else
  355. useradd user$i
  356. echo "Add user user$i finished."
  357. fi
  358. done
  359.  
  360. 示例:glob
  361. #!/bin/bash
  362. #
  363. for filename in /var/log/*; do
  364. file $filename
  365. done
  366.  
  367. 示例:命令生成列表
  368. #!/bin/bash
  369. #
  370. for username in $(cut -d: -f1 /etc/passwd); do
  371. echo "$username primary group: $(id -n -g $username)."
  372. done
  373. ~
  374.  
  375. 算术运算:
  376. +,-,*,%,**
  377.  
  378. sum=$a+$b
  379. (1)$[$A+$B]
  380. (2)$(($A+$B))
  381. (3)let VARIABLE=$A+$B
  382. (4)VARIABLE$(expr $A + $B)
  383.  
  384. 示例:
  385.  
  386. [root@localhost bin]# a=6
  387. [root@localhost bin]# b=7
  388. [root@localhost bin]# sum=$a+$b
  389. [root@localhost bin]# echo $a+$b
  390. 6+7
  391. [root@localhost bin]# echo $[$a+$b]
  392. 13
  393. [root@localhost bin]# let $a+$b
  394. [root@localhost bin]# let sum=$a+$b
  395. [root@localhost bin]# echo $sum
  396. 13
  397. [root@localhost bin]# expr $a + $b
  398. 13
  399.  
  400. 示例:求100以内正整数之和;
  401. #!/bin/bash
  402. #
  403. declare -i sum=0
  404.  
  405. for i in {1..100}; do
  406. sum=$[$sum+$i]
  407. done
  408.  
  409. echo $sum
  410.  
  411. 练习:求100以内所有偶数之和;
  412. 使用至少三种方法实现;

Linux shell脚本编程(一)的更多相关文章

  1. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

  2. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

  3. Linux Shell脚本编程--Linux特殊符号大全

    Linux Shell脚本编程--Linux特殊符号大全 linux_shell 特殊符号的介绍 2011

  4. Linux Shell脚本编程while语句

    Linux Shell脚本编程while语句案例 1,每隔3秒,打印一次系统负载 #!/bin/bash while truedo    uptime    sleep 3done 2,把监控结果保存 ...

  5. Linux Shell脚本编程-基础1

    概述:  shell脚本在Linux系统管理员的运维工作中非常重要.shell脚本能够帮助我们很方便的管理服务器,因为我们可以指定一个任务计划,定时的去执行某一个脚本以满足我们的需求.本篇将从编程基础 ...

  6. Linux shell脚本编程基础之练习篇

    shell脚本编程基础之练习篇. 1.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. #!/bin/bash ] then echo "请输入一个参数& ...

  7. 【学习】Linux Shell脚本编程

    1.脚本的组成和执行 Linux shell脚本的结构并不复杂,其主要由变量.内部命令以及shell的语法结构和一些函数.其他命令行的程序等组成,以下是一个简单的shell脚本. #!/bin/bas ...

  8. [linux] shell脚本编程-xunsearch安装脚本学习

    安装脚本setup.sh #!/bin/sh # FULL fast install/upgrade script # See help message via `--help' # $Id$ # s ...

  9. Linux Shell脚本编程的注意事项

    Linux下(Shell脚本 http://www.jbxue.com/jb/shell/)编程的一些注意事项,如编程风格.命名风格等. 一.常用技巧 ssh user@server bash < ...

随机推荐

  1. Atitit 外包管理规范attilax总结

    Atitit 外包管理规范attilax总结 1. 常见的外包问题2 1.1. 使用了过时的语言与技术2 1.2. 不易扩展的架构,架构落后2 1.3. 使用了小众语言,框架类库,组件等技术,导致维护 ...

  2. json数据格式及json校验格式化工具简单实现

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, ...

  3. 深入netty源码解析之一数据结构

    Netty是一个异步事件驱动的网络应用框架,它适用于高性能协议的服务端和客户端的快速开发和维护.其架构如下所示: 其核心分为三部分, 最低层为支持零拷贝功能的自定义Byte buffer: 中间层为通 ...

  4. 读书笔记--SQL必知必会15--插入数据

    15.1 数据插入 使用INSERT语句将行插入(或添加)到数据库表.可能需要特定的安全权限. 插入完整的行 插入行的一部分 插入某些查询的结果 15.1.1 插入完整的行 要求指定表名和插入到新行中 ...

  5. ARM CPU大小端

    ARM CPU大小端: 大端模式:低位字节存在高地址上,高位字节存在低地址上 小端模式:高位字节存在高地址上,低位字节存在低地址上 STM32属于小端模式,简单的说,比如u32 temp=0X1234 ...

  6. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  7. The Java Enum: A Singleton Pattern [reproduced]

    The singleton pattern restricts the instantiation of a class to one object. In Java, to enforce this ...

  8. 记录软件工程课程项目开发时遇到的各种小问题(django)

    1.python manage.py makemigrations 无效/无法检测出model的变化 在修改了models.py之后,我们想要更新数据库的表,使用了python manage.py m ...

  9. ubuntu Chromium 安装 pepperflashplugin

    sudo apt-get update sudo apt-get install chromium-browser sudo apt-get install pepperflashplugin-non ...

  10. 【C#】无损转换Image为Icon

    如题,市面上常见的方法是: var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle); //通过句柄得到图标 此法的问题 ...