Linux shell脚本编程(一)
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脚本编程(一)的更多相关文章
- Linux shell脚本编程(三)
Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...
- Linux shell脚本编程(二)
Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...
- Linux Shell脚本编程--Linux特殊符号大全
Linux Shell脚本编程--Linux特殊符号大全 linux_shell 特殊符号的介绍 2011
- Linux Shell脚本编程while语句
Linux Shell脚本编程while语句案例 1,每隔3秒,打印一次系统负载 #!/bin/bash while truedo uptime sleep 3done 2,把监控结果保存 ...
- Linux Shell脚本编程-基础1
概述: shell脚本在Linux系统管理员的运维工作中非常重要.shell脚本能够帮助我们很方便的管理服务器,因为我们可以指定一个任务计划,定时的去执行某一个脚本以满足我们的需求.本篇将从编程基础 ...
- Linux shell脚本编程基础之练习篇
shell脚本编程基础之练习篇. 1.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. #!/bin/bash ] then echo "请输入一个参数& ...
- 【学习】Linux Shell脚本编程
1.脚本的组成和执行 Linux shell脚本的结构并不复杂,其主要由变量.内部命令以及shell的语法结构和一些函数.其他命令行的程序等组成,以下是一个简单的shell脚本. #!/bin/bas ...
- [linux] shell脚本编程-xunsearch安装脚本学习
安装脚本setup.sh #!/bin/sh # FULL fast install/upgrade script # See help message via `--help' # $Id$ # s ...
- Linux Shell脚本编程的注意事项
Linux下(Shell脚本 http://www.jbxue.com/jb/shell/)编程的一些注意事项,如编程风格.命名风格等. 一.常用技巧 ssh user@server bash < ...
随机推荐
- 最近做了了解java基础的一些题,整理自己用到的一些函数和了解的一些名词
[程序1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析: 兔子的规律为数列1,1,2, ...
- div里嵌套了img 底部会出现白边
因为img默认是按基线(baseline)对齐的.对比一下图片和右边的p, q, y等字母,你会发现这三个字母的“小尾巴”和图片下方的空白一样高.下面这张图中的黑线就是那条基线. 要去掉空格可以使用v ...
- JavaScript 中对变量和函数声明的“提前”
变量声明“被提前” JavaScript 的语法和 C .Java.C# 类似,统称为 C 类语法.有过 C 或 Java 编程经验的同学应该对“先声明.后使用”的规则很熟悉,如果使用未经声明的变量或 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(23)-权限管理系统-角色组模块
系列目录 距离上次发布22讲已经有少许日子了,真是太抱歉,最近年关项目比较急,时间太紧,没有时间发布.请大家见谅 接下来我们的目标是 角色组管理 角色组权限设置 用户管理 把角色组授权给用户 给用户分 ...
- Android总结之Gzip/Zip压缩
前言: 做过Android网络开发的都知道,在网络传输中我们一般都会开启GZIP压缩,但是出于刨根问底的天性仅仅知道如何开启就不能满足俺的好奇心的,所以想着写个demo测试一下比较常用的两个数据压缩方 ...
- SQL Server-聚焦聚集索引对非聚集索引的影响(四)
前言 在学习SQL 2012基础教程过程中会时不时穿插其他内容来进行讲解,相信看过SQL Server 2012 T-SQL基础教程的童鞋知道前面写的所有内容并非都是摘抄书上内容,如若是这样那将没有任 ...
- webpack 填坑指南
根据慕课网的教程,重写的一遍基于webpack+react的画廊应用 github地址 第一坑: 使用json-loader的时候require文件的时候报错,显示: Module build fai ...
- ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化
原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...
- 微信小程序-阅读小程序demo
今天和朋友聊天说到小程序,然后看在看书,然后我们就弄了个小读书的demo,然后现在分享一下. 一.先来上图: 二.然后下面是详细的说明 首先先说下边的tabBar,项目采用json格式的数据配置,不 ...
- 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?
这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...