Linux shell脚本编程:
守护进程,服务进程:启动?开机时自动启动:
交互式进程:shell应用程序 广义:GUI,CLI
GUI:
CLI:
词法分析:命令,选项,参数
内建命令:
外部命令:PATH
fork()创建为一个进程: 把要运行的一系列命令,写在文件中:
脚本或程序源文件:文本文件
两种方式:
编译执行:预处理---->编译---->汇编---->链接:事先完成,结果:二进制程序文件
C,C++
解释执行:由解释器全程参与运行过程,每次读取一行,运行一行;
Python:程序库
程序控制结构:调用编程库完成编程编写;
库文件:功能模块,在编程中可调用;通过其API:应用编程接口;
Bash:程序
程序控制结构,调用机器上命令程序文件进行编程编写;
外部命令:各应用程序提供;
程序:指令+数据
算法+数据结构 过程式编程:以指令为中心,设计算法,数据服务于算法;
对象式编程:以数据为中心,设计数据结构(类),程序服务于数据结构; bash过程式编程:
顺序执行:逐个执行
选择执行:只执行其中一个分支
循坏执行:一段代码要执行0,1或多遍 编程元素:变量、流程、函数 变量:可变化的量,命名内存空间 bash环境:
本地变量:当前shell进程;
环境变量:当前shell进程及其子进程;
局部变量:某个函数执行过程;
位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数;
特殊变量:$?,$*,$@,$#,$$ 变量类型:
数值,字符: 数值:
整数
浮点数
字符:
ASCII
120:
字符:1, 2 , 0
数值:120 ---> 变量类型的作用:
存储空间
运算格式 语言对变量类型的支持力度:
强类型:
弱类型:变量类型不严格区分;
默认存储机制:bash为字符 bash的变量使用特点:弱类型、无需事先说明; 本地变量:
name=value
name:变量名
=:赋值符号
value:值 变量名:只能包含数字、字母和下划线:且不能以数字开头;
引用变量:${name},name
例:
[root@localhost ~]# animal="panao"
[root@localhost ~]# echo ${animal}
panao
引用:
弱引用:"",其内部的变量引用会替换为变量值;
强引用:'',其内部的变量引用会保持原有字符;
命令引用:`COMMAND`,$(COMMAND),引用命令的执行结果; 声明为整型:
declare -i name[=value]
let name=value 生命周期:
创建
销毁:
自动销毁:shell进程终止;
手动销毁:unset name
例:
[root@localhost ~]# unset animal 环境变量:
被"导出"的本地变量
export name[=value]
declare -x name[=value] 查看所有环境变量:env,printenv,export 销毁:
unset name 脚本:文本文件
运行脚本:事实上是运行一个bash进程,此进程负责从脚本文件中读取一个执行逻辑,而后有bash进程负责解析并运行此逻辑;
启动脚本:
(1) #bash /PATH/TO/SCRIPT_FILE
(2)一个执行权限,
# ./PATH/TO/SCRIPT_FILE shebang:
#!/bin/bash 第一行:顶格给出shebang
注释行:# bash的常用选项:
-n:检查脚本中的语法错误;
-x:调试执行脚本; 命令的状态结果:
bash进程用于追踪执行的命令成功与否的状态;
0:成功
1-222:失败 特殊变量:
$?:上一条命令的执行状态结果;
例:
[root@localhost bin]# echo $?
0 // 0表示成功 布尔型:
"真":成功
"假":失败 自定义脚本的状态结果:
exit[n] 注意:脚本中任何位置执行了exit命令即会终止当前shell进程; 条件测试:
界定程序执行环境: (1)根据运行的命令的状态结果;
(2)测试表达式
test EXPRESSION
[ EXPRESSION ] //括号两边必须有空格
[[ EXPRESSION ]] //括号两边必须有空格 整数测试:隐含着做数值大小比较,所以不要给变量引用加引用;
$A -gt $B:是否大于:是则为"真",否则为"假";
$A -ge $B:是否大于等于;
$A -lt $B:是否小于;
$A -le $B:是否小于等于;
$A -eq $B:是否等于;
$A -ne $B:是否不等于;
字符串测试:ASCII数值越大,字符比较时其值越大
"$A" > "$B":是否大于;
"$A" < "$B":是否小于;
"$A" == "$B":是否等于;
"$A" != "$B":是否不等于;
-z "$A":是否为空;空则为"真",否则为"假"
-n "$A":是否不空;不空则为"真",空则为"假" 注意:应该使用[[ EXPRESSION ]] 文件测试:测试文件的存在性以及属性;
-e $file:是否存在,存在则为"真",否则为"假"
-a $file:同上
-f $file:文件是否存在且为普通文件;
-d $file:文件是否存在且为目录;
-h $file:是否存在且为符号链接文件;
-L $file:同上;
-b $file:是否存在且为块设备文件;
-c $file:是否存在且为字符设备文件;
-S $file:是否存在且为套接字文件;
-p $file:是否存在且为管道文件; -r $file:当前用户对文件是否拥有读权限;
-w $file:当前用户对文件是否拥有写权限;
-x $file:当前用户对文件是否拥有执行权限; -u $file:文件是否拥有SUID权限;
-g $file:文件是否拥有SGID权限;
-k $file:文件是否拥有sticky权限; -O $file:当前用户是否为指定文件的属主;
-G $file:当前用户是否为指定文件的属组; 双目操作符:
$file1 -nt $file2:file1是否新于file2,file1的最近一次的修改时间是否晚于file2的;
$file1 -ot $file2:file1是否旧于file2,file1的最近一次的修改时间是否早于file2的;
$file1 -ef $file2:file1与file2是否指向了同一个inode:测试二者是否为同一个文件的硬链接; 特殊设备:
/dev/null:空,bit buckets,吞下所有数据,并直接丢弃;
/dev/zero:突出一堆0: bash之条件判断(选择执行):
if/then,case if CONDITTION;then
if-true-分支
fi if CONDITTION;then
if-true-分支
else
if-false-分支 !CONDITTION:取反 练习:写一个脚本
如果其路径不存在,则将其创建为目录,否则显示其存在,并显示内容类型; #!/bin/bash
#
filename="/tmp/x/y/z/testdir"
if [ -e $filename ];then
echo "$filename exists."
file $filename
else
mkdir -p $filename
fi
~
~
脚本参数(位置参数变量):
./script.sh /etc/fstab /etc/grub2.cfg
$0 $1 $2 位置参数变量:$1,$2,....
${10} 特殊变量:
$?:命令的状态结果;
$#:传递给脚本或函数的参数个数;
$*和$@:引用传递给脚本或函数的参数列表; shift:[n]:轮替 与用户交互:
read命令:
read [option] VAR...
-p "PROMPT"
-t timeout
示例: #!/bin/bash
# read -p "Plz enter a username: " -t 5 username if [ -z "$username" ]; then
username="myuser"
fi if id $username &> /dev/null; then
echo "$username exists."
else
useradd $username
fi 命令引用:
`COMMAND`,$(COMMAND) 引用命令的执行结果:
(1)ls `which cat`
(2)lines=$(wc -l /etc/fstab | cut -d '' -f1) #!/bin/bash
#
if [ -f $1 ]; then
lines=$(wc -l $1 | cut -d' ' -f1)
echo "$1 has $lines lines."
else
echo "$1 not exists or not a file."
fi 练习:写一个脚本,完成如下功能:
判断给定的两个数值,孰大孰小;
给定数值的方法:脚本参数,命令交互;
代码如下: 1 #!/bin/bash
2 #
3 read -p "Plz enter two integer: " -t 10 num1 num2
4
5 if [ -z "$num1" ];then
6 echo "Plz give two integers."
7 exit 1
8 fi
9
10 if [ -z "$num2" ];then
11 echo "Plz give two integers."
12 exit 1
13 fi
14
15 if [$num1 -ge $num2 ];then
16 echo "Max: $num1,Min;$num2."
17 else
18 echo "Max:$num2,Min:$num1."
19 fi
循环语句:
for,while,until 循环:将循坏体代码执行0、1或多次;
进入条件:进入循环的条件;
退出条件:循环终止的条件; for VARIABLE in LIST;do
循环体
done LIST:是由一个或多个空格分隔开的字符串组成;
把列表的每个字符串逐个赋值给VARIABLE表示的变量; for username in user1 user2 user3;do
循环体
done 进入条件:列表非空
退出条件:列表遍历结束; 添加5个用户:
#!/bin/bash
#
for username in user1 user2 user3 user4 user5; do
if id $username &> /dev/null; then
echo "$username exists."
else
useradd $username
echo "Add user $username finished."
fi
done
LIST的生成方法:
(1)整数列表
(a){start..end}
(b)$(seq start [[step]end])
(2)直接给出
(3)glob
(4)根据命令生成 示例:数值列表
#!/bin/bash
#
for i in {1..10}; do
if id user$i &> /dev/null; then
echo "user$i exists."
else
useradd user$i
echo "Add user user$i finished."
fi
done 示例:glob
#!/bin/bash
#
for filename in /var/log/*; do
file $filename
done 示例:命令生成列表
#!/bin/bash
#
for username in $(cut -d: -f1 /etc/passwd); do
echo "$username primary group: $(id -n -g $username)."
done
~ 算术运算:
+,-,*,%,** sum=$a+$b
(1)$[$A+$B]
(2)$(($A+$B))
(3)let VARIABLE=$A+$B
(4)VARIABLE$(expr $A + $B) 示例: [root@localhost bin]# a=6
[root@localhost bin]# b=7
[root@localhost bin]# sum=$a+$b
[root@localhost bin]# echo $a+$b
6+7
[root@localhost bin]# echo $[$a+$b]
13
[root@localhost bin]# let $a+$b
[root@localhost bin]# let sum=$a+$b
[root@localhost bin]# echo $sum
13
[root@localhost bin]# expr $a + $b
13 示例:求100以内正整数之和;
#!/bin/bash
#
declare -i sum=0 for i in {1..100}; do
sum=$[$sum+$i]
done echo $sum 练习:求100以内所有偶数之和;
使用至少三种方法实现;

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. 警告: [unchecked] 对作为原始类型IScheme的成员的write(TProt ocol,T)的调用未经过检查

    jdk 从8 改成了7 就好了! 或者, 修改源码, 每个响应的地方加上 surppressingWarnings xxx , 或者使用 请使用 -Xlint:unchecked 重新编译. 参照 h ...

  2. 学习WCF入门的第一个实例

    一.概述 WCF说白了就是一个基于终结点的通信手段!就是Service端提供一定的功能实现,然后暴露出一个或多个终结点,Client端调用Service端的功能(可以理解为调用一个函数),那么Clie ...

  3. word-break: break-all;、word-break: keep-all; 、word-wrap: break-word;和white-space:nowrap;都有什么作用

    小颖最近心情不好,心情不好就容易做傻事,所以昨天就干了件傻事 小颖昨天脑子一抽去拔罐了,拔完我就~~~~~~~~~~~~疼死宝宝了,昨晚一晚都没睡好,都不敢平躺,难受一晚上,早上到公司后困得啊,也是傻 ...

  4. Bagging与随机森林算法原理小结

    在集成学习原理小结中,我们讲到了集成学习有两个流派,一个是boosting派系,它的特点是各个弱学习器之间有依赖关系.另一种是bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合. ...

  5. js判断本机是否已安装app

    需求:在浏览器或者app webview中打开的页面,js判断本机是否已安装搜狐新闻客户端. 一.微信 1.分享——好友/朋友圈,feed会有搜狐新闻标记,打开url后缀参数isappinstalle ...

  6. Python基础(三)

    本章内容: 深浅拷贝 函数(全局与局部变量) 内置函数 文件处理 三元运算 lambda 表达式 递归(斐波那契数列) 冒泡排序 深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝 ...

  7. How to implement equals() and hashCode() methods in Java[reproduced]

    Part I:equals() (javadoc) must define an equivalence relation (it must be reflexive, symmetric, and ...

  8. 代码的坏味道(12)——平行继承体系(Parallel Inheritance Hierarchies)

    坏味道--平行继承体系(Parallel Inheritance Hierarchies) 平行继承体系(Parallel Inheritance Hierarchies) 其实是 霰弹式修改(Sho ...

  9. 使用F#开发ASP.NET Core应用程序

    .NET Core 里的F# 在.NET Core刚发布时,就已经添加了对F#的支持.但因为当时F#组件还不完整,而一些依赖包并没有放在Nuget上,而是社区自己放到MyGet上,所以在使用dotne ...

  10. Base-64 字符数组或字符串的长度无效等问题解决方案

    项目特殊需要,调用ActiveX三维控件进行控件某一特殊部位的截图操作,这个截图保存由ActiveX控件控制保存到本地是没问题的,现在需要将这个截图上传到服务器,多人共享,就牵扯到需要读取本地文件…… ...