环境
  虚拟机:VMware 10
  Linux版本:CentOS-6.5-x86_64
  客户端:Xshell4
  FTP:Xftp4

一、多层bash
#.和source都是当前bash

[root@node1 ~]# echo $$

sh01.sh:
echo $$ [root@node1 ~]# . sh01.sh [root@node1 ~]# source sh01.sh #在调用bash 进入子bash
[root@node1 ~]# bash sh01.sh

pstree:

sh02.sh:

#!/bin/bash
echo $$
pstree

[root@node1 ~]# ./sh02.sh
1594
init─┬─auditd───{auditd}
├─crond
├─master─┬─pickup
│ └─qmgr
├─6*[mingetty]
├─rsyslogd───3*[{rsyslogd}]
├─sshd───sshd───bash───sh02.sh───pstree
└─udevd───2*[udevd]

#!/bin/bash 等同于开启一个子bash,如果不写这一行 默认开启一个bash

注意:搞清父子bash,不同bash执行结果可能不同。

二、重定向
输出重定向操作符
>:重定向 会覆盖
>>:重定向 追加
标准输出重定向:
ls / 1>1.out
标准错误输出重定向:
ls /abc 2>2.out
将标准输出和错误输出重定向到同一个文件里:
先将标准输出定向到文件,然后将标准错误输出重定向到标准输出(左边不能有空格),错误信息会先打印
ls / /abc 1>ls.out 2>&1
或者
ls / /abc >& ls.out
或者
ls / /abc &> ls.out

输入重定向
<<<:从一个字符读数据
<<:将标志之间的换行符之前的内容输入
<:从一个文件读取数据

[root@node1 /]# read aaa<<<abc.txt
[root@node1 /]# echo $aaa
abc.txt #对换行符敏感
[root@node1 /]# read bbb<<AABB
> mmm
> nnn
> ddd
> AABB
[root@node1 /]# echo $bbb
mmm [root@node1 /]# cat <abc.txt
hello world [root@node1 fd]# ll
total
lrwx------. root root Dec : -> /dev/pts/
lrwx------. root root Dec : -> /dev/pts/
lrwx------. root root Dec : -> /dev/pts/
lrwx------. root root Dec : -> /dev/pts/
#创建百度TCP连接 重定向到输入8文件
[root@node1 fd]# exec <> /dev/tcp/www.baidu.com/
[root@node1 fd]# ll
total
lrwx------. root root Dec : -> /dev/pts/
lrwx------. root root Dec : -> /dev/pts/
lrwx------. root root Dec : -> /dev/pts/
lrwx------. root root Dec : -> /dev/pts/
lrwx------. root root Dec : -> socket:[]
#通过8输入文件 创建到百度HTTP请求
[root@node1 fd]# echo -e "GET / HTTP/1.0\n" >&
#通过8输入文件 查看百度http请求返回
[root@node1 fd]# cat <&

三、变量
本地:
  当前shell拥有
  生命周期随shell

局部:
  只能local用于函数

位置:  

$,$,${}
脚本
函数

特殊:  

$#:位置参数个数
$*:参数列表,双引号引用为一个字符串
$@:参数列表,双引号引用为单独的字符串
$$:当前shell的PID:接收者
   $BASHPID:真实
   管道
$?:上一个命令退出状态
   :成功
   非0:失败
[root@node1 /]# aaa=(  )
[root@node1 /]# echo ${aaa[*]} [root@node1 /]# echo ${aaa[@]}
管道:
()管道会在|两侧各开启一个子bash,不会影响父bash的值
[root@node1 /]# a=
[root@node1 /]# a=|echo ok
ok
[root@node1 /]# echo $a ()管道里面会继承父bash里的变量 但在文件里就不会继承 需要使用export先导出
[root@node1 /]# b=
[root@node1 /]# a= | echo $b sh04.sh:
echo $c [root@node1 ~]# c=
[root@node1 ~]# ./sh04.sh [root@node1 ~]# export c
[root@node1 ~]# ./sh04.sh # $BASHPID是真实pid
[root@node1 ~]# echo $$ [root@node1 ~]# echo $$ | more [root@node1 ~]# echo $BASHPID | more

五、退出状态和逻辑判断

退出状态
echo $?
逻辑判断
command1 && command2
command1 || command2

添加用户示例:

#! /bin/bash
[ ! $# -eq ] && echo "args error!!!" && exit
id $ >&/dev/null && echo "user exist" && exit
useradd $ >&/dev/null && echo $ | passwd --stdin $ >&/dev/null && echo "user add success" && exit
echo "i don't know ,user add fail" && exit

六、表达式
1.算术表达式
let 算术运算表达式
let C=$A+$B
$[算术表达式]
C =$[$A+$B]
$((算术表达式))
C=$(($A+$B))
expr 算术表达式
注意:表达式中各操作数及运算符之间要有空格。而且要使用命令引用
C=`expr $A + $B`
help let

2.条件表达式
(1)[ expression ]
(2)test expression
(3)[[ expression ]]
help test

七、流程控制

if:
[root@node1 ~]# if test -eq ; then echo = ;fi
= while:
[root@node1 ~]# while test $a -le ;do echo $a;((a++));done for:
[root@node1 ~]# for ((a=;a<=;a++));do echo $a;done [root@node1 ~]# for i in ;do echo $i;((i++));done [root@node1 ~]# seq [root@node1 ~]# for i in `seq `;do echo $i;((i++));done

IFS:内部域分隔符,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。

#! /bin/bash
#先保存原分隔符 修改为换行符
oldIFS=$IFS
IFS=$'\n'
#遍历
for i in `du -a $ | sort -nr`;
do
filename=`echo $i | awk {print $}`
if [ -f $filename ];
then
echo $filename;
break;
fi;
done
#分隔符改回默认值
IFS=$oldIFS

四种读取文件的方式:

#! /bin/bash
num=
oldIFS=$IFS
IFS=$'\n'
for i in `cat file.txt`;do
echo $i;
((num++))
done
echo "num:$num"
IFS=$oldIFS
echo "----------------------"
num=
lines=`cat file.txt | wc -l`
for((i=;i<=lines;i++));do
line=`head -$i file.txt | tail -`
echo $line
((num++))
done
echo "num:$num"
echo "-------------------"
num=
while read line;do
echo $line
((num++))
done <file.txt
echo "num:$num"
echo "----------------"
num=
cat file.txt | while read line;do
echo $line
((num++))
done
echo "num:$num"

【Linux学习八】脚本编程的更多相关文章

  1. Linux学习之socket编程(二)

    Linux学习之socket编程(二) 1.C/S模型——UDP UDP处理模型 由于UDP不需要维护连接,程序逻辑简单了很多,但是UDP协议是不可靠的,实际上有很多保证通讯可靠性的机制需要在应用层实 ...

  2. 30分钟快速学习Shell脚本编程

    什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch ...

  3. 【Linux】Shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  4. Linux 利器- Python 脚本编程入门(一)

    导读 众所周知,系统管理员需要精通一门脚本语言,而且招聘机构列出的职位需求上也会这么写.大多数人会认为 Bash (或者其他的 shell 语言)用起来很方便,但一些强大的语言(比如 Python)会 ...

  5. linux(七)__shell脚本编程

    一.什么是shell脚本 shell除了是命令解释器之外还是一种编程语言,用shell编写的程序类似于DOS下的批处理程序. 它是用户与操作系统之间的一个接口. shell脚本语言非常擅长处理文本类型 ...

  6. Linux学习之Shell编程基础

    转自:http://my.oschina.net/itblog/blog/204410 1 语法基本介绍1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来 ...

  7. Linux 学习 (八) Shell

    Linux达人养成计划 I 学习笔记 Shell 是什么: Shell 是一个命令解释器 Shell 还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强 Shell 的分类: Bourne S ...

  8. linux学习总结----shell编程

    ## 环境变量 ## 全局变量 ``` 常见的全局环境变量 PATH 指令的搜索路径 HOME 用户的家目录 LOGNAME 登录名 SHELL 脚本的类型 使用全局环境变量 echo $PATH 自 ...

  9. Linux学习之socket编程(一)

    socket编程 socket的概念: 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket. 在TCP协议中,建立连接的两个进 ...

随机推荐

  1. 洛谷P3193 [HNOI2008]GT考试 kmp+dp

    正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...

  2. set的经典应用

    set的经典应用 刚开始用map标记一个测试点超时了 ┭┮﹏┭┮: 用set的find 减少了循环提高了效率 #include <bits/stdc++.h>using namespace ...

  3. C++ 方阵原地旋转90度

    不额外申请内存(另外的一个二维数组空间),将一个方阵(二维数组)原地旋转90度,主要的思路是,由外向内,一圈圈的进行旋转(就是依次进行交换),如下图所示,当这些圈圈都交换完了之后,就完成了原地旋转了. ...

  4. MySQL Community Server 8.0.11下载与安装配置

    一.下载 1.选择合适的安装包,我在这里下载的是目前最新的安装包,8.0.11,而且我选择下载的是解压版的,安装版的话,安装会比较麻烦. MySQL Community Server下载链接:http ...

  5. pycharm快捷键帮助文档Keymap Reference

    前面我们已经安装了pycharm,为了提升效率,我们一般会用到快捷键操作,pycharm有哪些快捷键呢?Pycharm中打开Help->Keymap Reference可查看默认快捷键帮助文档, ...

  6. zabbix基础知识

    zabbix监控 初级 1.识别监控对象(分级) 2.理解监控对象(理论知识) 3.细分监控对象的指标 4.确定报警的基准线 预中级 1.工具化和监控分离 2.监控对象的分类 2.1硬件监控(方法:机 ...

  7. [geos]Geometry基本的几何对象

    读取shp中的点,读取shp中的线, (1)读取shp中的多边形,修改属性字段的值. 类库版本:geos3.6.2,shapelib1.3 定义类变量: GeometryFactory::unique ...

  8. Mac搭建PHP+rabbitMQ环境

    RabbitMQ是一个在AMQP基础上实现的企业级消息系统.何谓消息系统,就是消息队列系统,消息队列是“”消费-生产者模型“”的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅 ...

  9. 接口,定义接口的关键字是 interface 实现接口关键字是 implements

    当抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口interface特点:对于接口中常见的成员:而且这些成员都有固定的修饰符,不写就默认存在1:全局常量 :  都是 p ...

  10. Django 框架 数据库操作2

    一.ORM的操作方法总结 get(self, *args, **kwargs): # 获取单个对象 def one_get(request): #直接得到一个表对象,也就是表记录 如果得到多个会报错 ...