导航:首页 > 编程语言 > bash编程系列

bash编程系列

发布时间:2023-01-04 07:09:05

‘壹’ bash是什么编程语言呀

什么是shell

shell是用户和linux操作系统之间的接口。Linux中有多种shell,其中缺省使用的是Bash。本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特性。

什么是shell

Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。

shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。

shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。

Shell是一种具备特殊功能的程序, 它是介于使用者和 UNIX/linux 操作系统之核心
程序(kernel)间的一个接口。为什么我们说 shell 是一种介于系统核心程序与使用者
间的中介者呢?读过操作系统概论的读者们都知道操作系统是一个系统资源的管理者与分
配者,当您有需求时,您得向系统提出;从操作系统的角度来看,它也必须防止使用者因
为错误的操作而造成系统的伤害?众所周知,对计算机下命令得透过命令(command) 或
是程序(program);程序有编译器(compiler)将程序转为二进制代码,可是命令呢?
其实shell 也是一支程序,它由输入设备读取命令,再将其转为计算机可以了解的机械码,
然后执行它。
各种操作系统都有它自己的 shell,以 DOS 为例,它的 shell 就是 command.com文
件。如同 DOS 下有 NDOS,4DOS,DRDOS 等不同的命令解译程序可以取代标准的
command.com ,UNIX 下除了 Bourne shell(/bin/sh) 外还有 C shell(/bin/csh)、
Korn shell(/bin/ksh)、Bourne again shell(/bin/bash)、Tenex C shell(tcsh)
等其它的 shell。UNIX/linux将 shell 独立于核心程序之外, 使得它就如同一般的应用
程序, 可以在不影响操作系统本身的情况下进行修改、更新版本或是添加新的功能。

有一些命令,比如改变工作目录命令cd,是包含在shell内部的。还有一些命令,例如拷贝命令cp和移动命令rm,是存在于文件系统中某个目录下的单独的程序。对用户而言,不必关心一个命令是建立在shell内部还是一个单独的程序。

shell首先检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是购买的商业程序,如xv,或者是自由软件,如emacs)。然后shell在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给Linux内核。

shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。

当普通用户成功登录,系统将执行一个称为shell的程序。正是shell进程提供了命令行提示符。作为默认值(TurboLinux系统默认的shell是BASH),对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。

一旦出现了shell提示符,就可以键入命令名称及命令所需要的参数。shell将执行这些命令。如果一条命令花费了很长的时间来运行,或者在屏幕上产生了大量的输出,可以从键盘上按ctrl+c发出中断信号来中断它(在正常结束之前,中止它的执行)。

当用户准备结束登录对话进程时,可以键入logout命令、exit命令或文件结束符(EOF)(按ctrl+d实现),结束登录。

‘贰’ linux bash 编程

#!/bin/bash
dirname='/home/flycat'
#wav文件所在的目录

cpdir='/home/wav'
#要cp文件的上级目录,比如我要在这个目录下按照前4位数建立文件名

cd $dirname
#进入wav文件所在目录

filename=(`ls | sed -rn 's/([0-9]*)_(.*)$/\1/p' | sort -u`)
#截取wav文件_前的数字,我是按照_前面数字不一定是4位,有可能是多个写的。所以就算
#以后你前面的数字超过4位,也可以匹配到,提取_前面的数字并去重,并复制给filename这个数组

for i in {filename[*]};do
#依次代入数组的元素

mkdir ${cpdir}/${i}
#按照元素创建文件名

ls ${i}* | xargs -i cp {} ${cpdir}/${i}
#按照元素名进行cp

done
#脚本没测试,自己按照自己的需求在改改吧。
#大概就是这个意思,你自己在修改一下吧。

‘叁’ Bash编程1——基本定义

POSIX:一系列基于Unix的开放系统标准。 Bash主要关注posix 1003.1标准的Shell和Utilities部分。

blank :空格或tab字符

builtin:由shell本身在内部实现的命令,而不是由文件系统中的某个可执行程序实现的命令。

control operator: 执行控制功能的记号。 它是换行符或以下之一:‘||’, ‘&&’, ‘&’, ‘;’, ‘;;’, ‘;&’, ‘;;&’, ‘|’, ‘|&’, ‘(’, or ‘)’

exit status:命令返回给调用者的值。 该值限制为8位,因此最大值为255。

field:一个文本单元,它是一个shell扩展的结果。 扩展后,执行命令时,生成的字段将用作命令名称和参数。

filename:用于标识文件的字符串。

job:组成一个管道的进程组以及其任一子进程,这些进程都处于同样的进程组。

job control:用户可以选择性地停止(暂停)和重新启动(恢复)进程执行的机制。

metachracter:一个分隔单词的字符(不加引号时)。 元字符是空格,制表符,换行符或以下字符之一:‘|’, ‘&’, ‘;’, ‘(’, ‘)’, ‘<’, or ‘>’。

name:由字母,数字和下划线组成并且以字母或下划线开头的单词。 名称用作shell变量名和函数名。 也称为标识符。

operator:控制操作符或重定向操作符。 运算符包含至少一个不带引号的元字符。

process group:一个具有相同进程组ID的相关进程的集合。

process group ID:在其生命周期内表示进程组的唯一标识符。

reserved word:一个对shell有特殊意义的词。 大多数保留字引入了shell流控制结构,例如for和while。

return status:exit status的同义词。

signal:一种机制,通过该机制,内核可以通知系统中发生的事件。

special builtin:shell内置命令,由posix标准分类为特殊命令。

token:shell的一系列字符被认为是一个单元。 它既可以是单词,也可以是运算符。

word:由shell处理为一个单元的字符序列。 单词可能不包括不带引号的元字符。

‘肆’ Bash编程013——环境变量

环境变量可以帮助提升你的Shell体验。很多程序和脚本都通过环境变量来获取系统信息,存储临时数据和配置信息。

bash使用环境变量( environment variables)来存储有关shell会话和工作环境的信息。这项功能允许你在内存中存储数据,以便程序或shell脚本能够轻松访问。这是存储持久数据的一种简便方法。bash的环境变量分为两类:全局变量和局部变量。

补充:bash使用一致的专有环境变量,但是不同发行版的linux可能会添加自己的环境变量,本博客使用的发行版为Ubuntu 16.04.5 Gnome。

全局变量对于shell会话和所有生成的子shell都是可见的。全局环境变量有助于子shell获取父shell信息。

在Linux中有四个命令可以帮助我们查看所有的环境变量,printenv、env、set、declare。

使用set命令时会一起显示之前定义的函数,仅显示变量可以使用如下命令:

局部变量只能在定义它们的进程中可见,Linux也有默认定义的标准局部环境变量。你也可以自己定义局部环境变量,称为用户定义局部变量。

set命令会显示某个特定进程的所有环境变量,包括局部变量、全局变量以及用户定义变量。

补充:set、env、printenv之间的区别很细微。set命令会显示出所有变量,并且按照字母顺序排序。env和printenv输出相同,但是仅含有全局变量,并且未对变量排序。

设置局部用户定义变量,就是之前002一节提到的变量。

注意:一般bash的环境变量都是使用的大写字母,建议自己的变量名为小写,避免产生冲突。

设置全局环境变量

先创建一个局部环境变量,然后使用export命令将其导出到全局变量。

使用unset命令,格式unset varname

注意:在子shell中删除全局环境变量不会影响到父shell的全局环境变量。

HOME:当前用户的主目录

IFS:shell用来将文本字符串分割成字段的一系列字符

PATH:shell用来查找命令的目录列表。当你输入一个命令时,shell会按照这个目录遍历寻找。

在登录系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫做启动文件或者环境文件。bash检查的启动文件取决于启动bash的方式:

登录Linux系统是,bash作为登录shell启动。登录shell会一次从以下几个启动文件中读取命令。

/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都是执行这个文件。

注意: 某些Linux发行版使用了可拆卸式认证模块(PAM)。这时,PAM文件会在bash启动前处理,这些文件可能会包含环境变量。PAM文件包括/etc/environment和$HOME/.pam_environment文件。

我们这里来查看一下/etc/profile文件的内容,学了之前的内容的话,这个文件很容易理解。

$HOME目录下的启动文件

剩下的启动文件都启着同一个作用:提供一个用户专属的启动文件来定义该用户所用到的环境变量。一般Linux发行版只有到下面这四个启动文件中的一两个。

这里列出Ubuntu的启动文件:

可以看到这里只有.bashrc和.profile两个文件。

shell会按照以下顺序执行启动文件,找到第一个其他的就会被忽略。

注意:这里没有$HOME/.bbashrc,因为该文件是通过上面三个文件中的一个运行的。

我们来查看一下.profile文件,.bashrc文件请自行查看。

注意:这里会检查当前运行的shell是否是bash,如是的话,检查是否存在$HOME/.bashrc,若存在则加载该文件。

交互式shell不是登录系统时启动的,它可能是你打开终端启动的。交互式shell不会访问/etc/profile文件,而是只会检查用户HOME目录中的.bashrc文件。

执行shell脚本是的非交互式shell。脚本能以不同的方式执行,可以启动子shell执行,也可以在当前shell中执行。

bash提供了一个BASH_ENV的环境变量,当shell启动一个非交互式shell进程时,它会检查这个环境边浪来查看要执行的启动文件。若有指定的文件,则shell会执行该文件。Ubuntu未设置该变量。

若BASH_ENV未设置,那么非交互式shell如何获得环境变量呢?对于以子shell进程执行的情况,子shell会继承父shell导出的变量(export)。对于在当前shell中执行的情况,变量即为当前shell的变量。

‘伍’ 在linux下能创建windows 的文件系统吗

所有课程全部公益学习,重磅出击,满满的干货!看完就会明白!

前言:加管理老师QQ开通公益学习权限 1815759616

01 运维基础
01_01_Centos7.2简介.avi
01_02_Centos7.2安装.avi
01_03_操作系统基础.avi
01_04_Linux操作系统基础.avi
02_01_Linux操作系统及常用命令.avi
02_02_Linux操作系统及常用命令.avi
02_03_Linux根文件系统详解.avi
02_04_Linux文件管理命令详解.avi
03_01_Linux文件管理类命令详解.avi
03_02_bash特性详解.avi
03_03_bash特性详解.avi
03_04_Linux用户及权限详解.avi
04_01_Linux用户管理命令详解.avi
04_02_权限及权限管理.avi
04_03_管理及IO重定向.avi
04_04_grep及正则表达式.avi
05_01_egrep及扩展正则表达式.avi
05_02_bash脚本编程之一 变量、变量类型等.avi
05_03_bash脚本编程之二 条件判断-.avi
05_04_bash脚本编程之三 条件判断及算术运算.avi
06_01_bash脚本编程之四 整数测试及特殊变量.avi
06_02_sed命令.avi
06_03_bash脚本编程之五 字符串测试及for循环.avi
07_01_vim编辑器详解.avi
07_02_bash脚本编程之六 使用脚本选项及组合条件测试.avi
07_03_Linux文件查找详解.avi
07_04_特殊权限SUID等详解.avi
08_01_facl及用户及Linux终端.avi
08_02_bash脚本编程之七 case语句及脚本选项进阶.avi
08_03_磁盘及文件系统管理详解之一.avi
08_04_磁盘及文件系统管理详解之二.avi
09_01_磁盘及文件系统管理详解之三.avi
09_02_磁盘及文件系统管理详解之五.avi
09_03_磁盘及文件系统管理详解之五.avi
09_04_Linux压缩及归档.avi
10_01_Raid及mdadm命令之一.avi
10_02_Raid及mdadm命令之二.avi
10_03_LVM之一.avi
10_04_LVM之二.avi
10_05_脚本编程之八 脚本完成磁盘分区格式化.avi
11_01_Linux网络配置之一.avi
11_02_Linux网络配置之二 IP报文.avi
11_03_Linux网络配置之三 TCP报文.avi
11_04_Linux网络配置之四 ifconfig及ip命令详解.avi
12_01_Linux软件管理之一 rpm.avi
12_02_Linux软件管理之二 rpm.avi
12_03_Linux软件管理之三 yum.avi
12_04_Linux软件管理之四 yum.avi
13_01_bash脚本编程之九 while循环.avi
13_02_bash脚本编程之十 函数).avi
13_03_Linux进程管理之一.avi
13_04_Linux进程管理之二.avi
14_01_Linux系统启动流程详解之一 运行级别及grub.avi
14_02_Linux系统启动流程之二 内核及init.avi
14_03_bash脚本编程之十一(Linux启动流程之三) SysV服务脚本.avi
14_04_Linux内核编译及系统裁减之一.avi
15_01_bash脚本编程之十二(Linux系统裁减之二) 系统函数库.avi
15_02_bash脚本编程之十三(Linux系统裁减之三) 系统函数库.avi
15_03_Linux系统裁减之四 自定义内核及busybox完成系统定制.avi
16_01_bash脚本编程之十四 信号捕捉及系统管理之任务计划.avi
16_02_Linux系统裁减之五.avi
16_03_Linux日志系统syslog.avi
16_04_Linux系统裁减之六 为系统添加ssh服务.avi
17_01_RHEL5.8系统安装及Kickstart.avi
17_02_Linux系统故障排除.avi
17_03_sudo详解.avi
18_01_加密类型及其相关算法.avi
18_02_ssl协议、openssl及创建私有CA.avi
18_03_OpenSSH服务及其相关应用.avi
19_01_DNS服务相关概念详解.avi
19_02_DNS服务相关概念详解.avi
19_03_Bind97服务安装配置.avi
20_01_DNS主从复制及区域传送.avi
20_02_DNS子域授权.avi
20_03_DNS视图及日志系统.avi
20_04_DHCP服务.avi
21_01_Web服务及http协议.avi
21_02_httpd安装配置.avi
21_03_httpd属性配置.avi
22_01_httpd虚拟主机.avi
22_02_基于openssl的https服务配置.avi

2 运维中级
23_01_php相关概念及配置.avi
23_02_数据库及MySQL.avi
23_03_MySQL初步,数据类型及SQL语句.avi
23_04_建立LAMP平台.avi
24_01_编译安装LAMP之httpd-2.4.4.avi
24_02_编译安装LAMP之MySQL-5.5.28(通用二进制格式).avi
24_03_编译安装LAMP之php-5.4.13、xcache-2.0及使用ab命令实现 24_04_编译安装LAMP之配置httpd以FastCGI方式与php整合.avi
25_01_邮件服务系列之基础原理.avi
25_02_邮件服务系列之编译安装Postfix-2.10.0.avi
25_03_邮件服务系列之Postifx常用配置.avi
25_04_邮件服务系列之Postfix常用配置.avi
26_01_邮件服务系列之 postifx+sasl+dovecot及虚拟域相关概念.avi
26_02_邮件服务系列之虚拟域、虚拟用户和webmail.avi
26_03_邮件服务系列之pop3s、maildrop.avi
27_01_ftp服务.avi
27_02_ftp服务.avi
27_03_nfs服务.avi
28_01_iptables系列之基础原理.avi
28_02_iptables系列之基本应用及显式扩展.avi
28_03_iptables系列之常用扩展模块.avi
28_04_iptables系列之nat及其过滤功能.avi
29_01_iptables系列之layer7.avi
29_02_iptables系列之layer7.avi
29_03_samba之一.avi
29_04_samba之二.avi
30_01_tcp_wraper&xinetd.avi
30_02_tcp_wrapper&xinetd.avi
30_03_nss&pam.avi
30_04_nss&pam.avi
31_01_bash编程系列之数组.avi
31_02_bash脚本编程之在bash脚本中使用选项.avi
31_03_配置使用vnc服务.avi
32_01_mysql系列之一关系型数据库基础理论.avi
32_02_mysql系列之二关系型数据库基础理论.avi
32_03_mysql系列之三MySQL数据库基础及编译安装.avi
32_04_mysql系列之四mysql客户端工具的使用.avi
33_01_MySQL系列之五——MySQL数据类型及sql模型.avi
33_02_MySQL系列之六——MySQL管理表和索引.avi
33_03_MySQL系列之七——单表查询、多表查询和子查询.avi
33_04_MySQL系列之八——多表查询、子查询及视图.avi
34_01_MySQL系列之九——MySQL事务和隔离级别.avi
34_02_MySQL系列之十——MySQL事务和隔离级别.avi
34_03_MySQL系列之十一——MySQL用户和权限管理.avi
34_04_MySQL系列之十二——MySQL日志管理.avi
35_01_MySQL系列之十三——MySQL日志管理.avi
35_02_MySQL系列之十四——MySQL备份和恢复.avi
35_03_MySQL系列之十五——使用LVM快照进行数据库备份.avi
35_04_MySQL系列之十六——使用xtrabackup进行数据库备份.avi

03 运维高级
36_01_Linux集群系列之一——集群基础概念.avi
36_02_Linux集群系列之二——LVS类型详解.avi
36_03_Linux集群系列之三——LVS调度方法及NAT模型的演示.avi
37_01_Linux集群系列之四——LVS DR详解及配置演示.avi
37_02_Linux集群系列之五——脚本实现LVS后端服务健康状态检
37_03_Linux集群系列之六——LVS持久连接.avi
37_04_awk入门及进阶.avi
38_01_Linux集群系列之七——高可用集群原理详解.avi
38_02_Linux集群系列之八——高可用集群原理详解之共享存储).avi
38_03_Linux集群系列之九——高可用集群原理详解之多节点集群.avi
38_04_Linux集群系列之十——高可用集群之heartbeat安装配置.avi
39_01_Linux集群系列之十一——高可用集群之heartbeat基于crm进行
39_02_Linux集群系列之十二——高可用集群之基于heartbeat和nfs的
39_03_Linux集群系列之十三——高可用集群之corosync基础概念及
39_04_Linux集群系列之十四——高可用集群之配置corosync资源及
40_01_Linux集群系列之十五——分布式复制块设备drbd的基础概念
40_02_Linux集群系列之十六——基于drbd+corosync的高可用 40_03_Linux集群系列之十七——RHCS架构详解.avi
40_04_Linux集群系列之十八——RHCS集群配置.avi
41_01_Linux集群系列之十九——iSCSI协议、架构及其安装配置.avi
41_02_Linux集群系列之二十——iSCSI及gfs2.avi
41_03_Linux集群系列之二十一——iSCSI、cLVM和gfs2.avi
41_04_Linux集群系列之二十二——keepalived详解.avi
41_05_Linux集群系列之二十三——keepalived详解补充.avi
42_01_MySQL主从复制——概念及架构详解.avi
42_02_MySQL主从复制——MySQL-5.5异步、半同步配置及其注意
42_03_MySQL主从复制——MySQL-5.6基于GTID及多线程的复制.avi
42_04_MySQL主从复制——mysql-proxy.0.8.3实现MySQL-5.6读写分
43_01_IO复用.avi
43_02_IO复用详解及高并发系统设计初步.avi
43_03_配置Ngnix作为Web Server详解.avi
44_01_nginx.avi
44_02_Nginx反向代理、负载均衡、缓存、URL重写及读写分离.avi
44_03_memcached安装配置及保存php session于memcached中的方
45_01_http反向代理及haproxy.avi
45_02_http反向代理及haproxy.avi
45_03_http缓存机制及varnish详解.avi
46_01_Tomcat系列之java技术详解.avi
46_02_Tomcat系列之java技术详解.avi
46_03_Tomcat系列之组件详解及服务安装配置.avi
47_01_Tomcat系列之apache使用mod_jk和mod_proxy反向代理
47_02_Tomcat系列之apache负载均衡请求至tomcat及DeltaManager
48_01_计算机及操作系统原理.avi
48_02_Linux操作系统原理.avi
48_03_CPU负载观察及调优方法.avi
49_01_Linux内存子系统及常用调优参数.avi
49_02_Linux内存子系统及常用调优参数.avi
50_01_虚拟化技术基础原理详解.avi
50_02_Xen虚拟化及DomU的实现.avi
51_01_Xen基于iscsi共享实现实时迁移.avi
51_02_kvm虚拟化.avi
51_03_OpenStack.avi
52_01_openstack.avi
52_02_openstack.avi
52_03_Hadoop.avi
52_04_Hadoop.avi
53_01_Hadoop补充视频之基本概念及安装.avi
53_02_Hadoop补充视频之基本概念及安装.avi
53_03_Hadoop补充视频之基本概念及安装.avi
53_04_MySQL优化思路及框架.avi
53_05_SELinux基础概念.avi
54_01_企业级监控系列之一——SNMP原理和实战.avi
54_02_企业级监控系列之二——RRD-tools绘图原理和应用.avi
54_03_企业级监控系列之三——cacti原理和安装.avi
54_04_企业级监控系列之四——cacti配置和高级用法.avi
55_01_企业级监控系列之五——Nagios基础和入门配置.avi
55_02_企业级监控系列之六——nagios高级应用及插件开发.avi
55_03_企业级监控系列之七——nagios高级应用及飞信报警功能.avi
56_01_RPM包制作1.avi
56_02_RPM包制作2.avi

加管理老师QQ开通公益学习权限 1815759616 收起

‘陆’ bash脚本编程需要哪些元素

1、命令,主要是指linux的命令,包括内部命令和外部命令。
2、bash语法,其实跟编程中的语法相同也分为顺序结构、判断结构、循环结构,万变不离其宗。
3、linux系统知识,因为shell脚本是在linux平台运行的,所以对linux系统的一些知识还是很有必要掌握的。

‘柒’ 有哪些好用的bash 技巧

简洁的bash编程技巧1) 检查命令执行是否成功第一种写法,比较常见:echoabcdee grep-q abcdif[ $? -eq0 ]; then echoFoundelse echoNot foundfi简洁的写法:ifechoabcdee grep-q abc; then echoFoundelse echoNot foundfi当然你也可以不要if/else,不过这样可读性比较差:[SunNov 04 05:58 AM] [kodango@devops] ~/workspace$echoabcdee grep-q abc && echoFound echoNot foundFound2) 将标准输出与标准错误输出重定向到/dev/null 第一种写法,比较常见:1grepabctest.txt1>/dev/null2>&1常见的错误写法:1grepabctest.txt2>&1 1>/dev/null简洁的写法:1grepabctest.txt&> /dev/null3) awk的使用举一个实际的例子,获取Xen DomU的id。常见的写法:1sudoxm li grepvm_name awk'{print $2}'简洁的写法:1sudoxm li awk'/vm_name/{print $2}'4) 将一个文本的所有行用逗号连接起来假设文件内容如下所示:[SatNov 03 10:04 PM] [kodango@devops] ~/workspace$cat/tmp/test.txt123使用Sed命令:123[SatNov 03 10:14 PM] [kodango@devops] ~/workspace$sed':a;$!N;s//n/,/;ta'/tmp/test.txt1,2,3简洁的写法:123[SatNov 03 10:04 PM] [kodango@devops] ~/workspace$paste-sd, /tmp/test.txt1,2,35) 过滤重复行假设文件内容如下所示:[SatNov 03 10:16 PM] [kodango@devops] ~/workspace$sort/tmp/test.txt常用的方法:[SatNov 03 10:16 PM] [kodango@devops] ~/workspace$sort/tmp/test.txt uniq123简单的写法:[SatNov 03 10:16 PM] [kodango@devops] ~/workspace$sort/tmp/test.txt-u6) grep查找单词假设一个文本的每一行是一个ip地址,例如[SatNov 03 10:20 PM] [kodango@devops] ~/workspace$cat/tmp/ip.list10.0.0.110.0.0.1210.0.0.123使用grep查找是否包括10.0.0.1这个ip地址。常见的写法:[SatNov 03 10:22 PM] [kodango@devops] ~/workspace$grep'10.0.0.1/>'/tmp/ip.list10.0.0.1简单的方法(其实这方法不见得简单,只是为了说明-w这个参数还是很有用的)123[SatNov 03 10:23 PM] [kodango@devops] ~/workspace$grep-w '10.0.0.1'/tmp/ip.list10.0.0.1顺便grep的-n/-H/-v/-f/-c这几参数都很有用。7) 临时设置环境变量常见的写法:[SatNov 03 10:26 PM] [kodango@devops] ~/workspace$exportLC_ALL=zh_CN.UTF-8[六11月 03 10:26 下午] [kodango@devops] ~/workspace$date2012年11月 03日 星期六 22:26:55 CST简洁的写法:[六11月 03 10:26 下午] [kodango@devops] ~/workspace$unsetLC_ALL[SatNov 03 10:27 PM] [kodango@devops] ~/workspace$LC_ALL=zh_CN.UTF-8 date2012年11月 03日 星期六 22:27:43 CST在命令之前加上环境变更的设置,只是临时改变当前执行命令的环境。8) $1,$2等位置参数的使用假设只想使用$2,$3..这几个参数,常见的做法是:12shiftecho$@为什么不这样写呢?1echo${@:2}9)退而求其次的写法相信大家会有这种需求,当一个参数值没有提供时,可以使用默认值。常见的写法是:arg=$1if[ -z $arg]; then arg=0fi简洁的写法是这样的:1arg=${1:-0}10)bash特殊参数–的用法假设要用grep查找字符串中是否包含-i,我们会这样尝试:[SatNov 03 10:45 PM] [kodango@devops] ~/workspace$echo'abc-i' grep-iUsage:grep[OPTION]... PATTERN [FILE]...Try'grep--help'formoreinformation.[SatNov 03 10:45 PM] [kodango@devops] ~/workspace$echo'abc-i' grep/-iabc-i简洁的方法是:123[SatNov 03 10:45 PM] [kodango@devops] ~/workspace$echo'abc-i' grep-- -iabc-ibash中–后面的参数不会被当作选项解析。11)函数的返回值默认是最后一行语句的返回值#Check whether an item is a function#$1: the function name#Return: 0(yes) or 1(no)functionis_function(){ localfunc_name=$1 test`type -t $1 2>/dev/null`= function}不要画蛇添足再在后面加一行return $?了。12) 将printf格式化的结果赋值给变量例如将数字转换成其十六进制形式,常见的写法是:12[SatNov 03 10:55 PM] [kodango@devops] ~/workspace$var=$(printf'%%%02x'111)简单的写法是:12[SatNov 03 10:54 PM] [kodango@devops] ~/workspace$printf-vvar '%%%02x'111看看printf的help[SatNov 03 10:53 PM] [kodango@devops] ~/workspace$help printf grep-A 1 -B 1 -- -vprintf:printf[-vvar] format[arguments] Formatsand prints ARGUMENTS under control of the FORMAT.-- Options: -vvar assign the output to shell variable VAR rather than displayit on the standard output13)打印文件行打印文件的第一行:1head-1 test.txt打印文件的第2行:1sed-n '2p'test.txt打印文件的第2到5行:1sed-n '2,5p'test.txt打印文件的第2行始(包括第2行在内)5行的内容:1sed-n '2,+4p'test.txt打印倒数第二行:12$tail-2 test.txt head-1$tac test.txt sed-n '2p'14)善用let或者(())命令做算术运算如何对一个数字做++运算,可能你会这样用:12a=1a=`expra + 1`为何不用你熟悉的:123a=1leta++leta+=215)获取软连接指定的真实文件名如果你不知道,你可能会这样获取:123[SatNov 03 11:12 PM] [kodango@devops] ~/workspace$ls-l /usr/bin/python awk-F'->''{print $2}' tr-d ''/usr/bin/python2如果你知道有一个叫readlink的命令,那么:123[SatNov 03 11:13 PM] [kodango@devops] ~/workspace$readlink /usr/bin/python/usr/bin/python216)获取一个字符的ASCII码[SatNov 03 11:14 PM] [kodango@devops] ~/workspace$printf'%02x''+2b[SatNov 03 11:30 PM] [kodango@devops] ~/workspace$echo-n '+' od -tx1 -An tr-d ''2b17)清空一个文件常见的用法:1echo> test.txt简单的写法:1>test.txt18) 不要忘记有here document下面一段代码:grep-v1 /tmp/test.txt whilereadline; do leta++ echo--$line--doneechoa:$a执行后有什么问题吗?[SunNov 04 05:35 AM] [kodango@devops] ~/workspace$sh test.sh--2----3--a:发现a这个变量没有被赋值,为什么呢?因为管道后面的代码是在在一个子shell中执行的,所做的任何更改都不会对当前shell有影响,自然a这个变量就不会有赋值了。换一种思路,可以这样做:grep-v1 /tmp/test.txt> /tmp/test.tmpwhilereadline; do leta++ echo--$line--done< /tmp/test.tmpechoa:$arm-f /tmp/test.tmp不过多了一个临时文件,最后还要删除。这里其实可以用到here document:b=1whilereadline2; do letb++ echo??$line2??done< < EOF`grep-v1 /tmp/test.txt`EOFechob: $bhere document往往用于需要输出一大段文本的地方,例如脚本的help函数。19)删除字符串中的第一个或者最后一个字符假设字符串为:12[SunNov 04 10:21 AM] [kodango@devops] ~/workspace$str=aremoveb可能你第一个想法是通过sed或者其它命令来完成这个功能,但是其实有很简单的方法:[SunNov 04 10:24 AM] [kodango@devops] ~/workspace$echo${str#?}removeb[SunNov 04 10:24 AM] [kodango@devops] ~/workspace$echo${str%?}aremove类似地,你也可以删除2个、3个、4个有没有一次性删除第一个和最后一个字符的方法呢?答案当然是肯定的:123[SunNov 04 10:26 AM] [kodango@devops] ~/workspace$echo${str:1:-1}remove关于这些变量替换的内容在bash的man手册中都有说明。20)使用逗号join数组元素假设数组元素没有空格,可以用这种方法:[SunNov 04 10:14 AM] [kodango@devops] ~/workspace$a=(1 2 3)$b=${a[*]}[SunNov 04 10:15 AM] [kodango@devops] ~/workspace$echo${b///,}1,2,3假设数组元素包含有空格,可以借用printf命令来达到:[SunNov 04 10:15 AM] [kodango@devops] ~/workspace$a=(1 234)[SunNov 04 10:15 AM] [kodango@devops] ~/workspace$printf,%s${a[@]} cut-c2- 1,23,421) Shell中的多进程在命令行下,我们会在命令行后面加上&符号来让该命令在后台执行,在shell脚本中,使用(cmd)可以让fork一个子shell来执行该命令。利用这两点,可以实现shell的多线程:job_num=10functiondo_work(){ echoDo work..}for((i=0; i<job_num ;i++)); do echoFork job $i (do_work)&donewait #wait for all job doneechoAll job have been done!注意最后的wait命令,作用是等待所有子进程结束。22) bash中alias的使用alias其实是给常用的命令定一个别名,比如很多人会定义一下的一个别名:1aliasll='ls-l'以后就可以使用ll,实际后执行的是ls -l。现在很多发行版都会带几个默认的别名,比如:aliasgrep='grep--color=auto' # 带颜色显示aliasls='ls--color=auto'# 同上aliasrm='rm-i' # 删除文件需要确认alias在某些方面确实提高了很大的效率,但是也是有隐患的,这点可以看我以前的一篇文章终端下肉眼看不见的东西。那么如何不要alias,而是用本来的意思呢?答案是使用转义:12/ls/grep在命令前面加一个反斜杠后就可以了。这里要插一段故事,前两天我在shell脚本中定义了下面的一个alias,假设位于文件util.sh:#!/bin/bash...aliasssh='ssh-o StrictHostKeyChecking=no -o LogLevel=quiet -o BatchMode=yes'...后面这串ssh选项是为了去掉一些warning的信息,不提示输入密码等等。具体可以看ssh的文档说明。我自己测试的时候好好的,当时我同事跑得时候却依然有报Warning。我对比了下我们两个人的用法:12shutil.sh #我的./util.sh #他的大家应该知道,直接./util.sh执行,shell会去找脚本第一行的shebang中给定的解释器去执行改脚本,所以第二种用法相当于直接用bash来执行。那想必是bash/sh对alias是否默认这一点上是有区别的了(可能是bash版本的问题,RHEL 5U4)。翻阅了下Bash的man手册,发现可以通过设置expand_aliases选项来打开alias的功能,默认在非交互式Shell下是关闭的(什么是交互式登录Shell)。修改下util.sh,打开这个选项就Ok了:#!/bin/bash...#Expand aliases in scriptshopt-s expand_aliasesaliasssh='ssh-o StrictHostKeyChecking=no -o LogLevel=quiet -o BatchMode=yes'...23)awk打印除第一列之外的其他列awk用来截取输入行中的某几列很有用,当时如果要排除某几列呢?例如有如下的一个文件:$cat/tmp/test.txt12 3 4 51020 30 40 50可以用下面的代码解决(来源):123$awk'{$1=;print $0}'/tmp/test.txt23 4 52030 40 50但是前面多了一个空格,可以用cut命令稍微调整下:123$awk'{$1=;print $0}'/tmp/test.txt cut-c2-23 4 52030 40 50附几则小技巧:1)sudo iptables -L -n vim -2)grep -v xxx vim -3)echo $’/4)set — 1 2 3; echo $@5)搜索stackoverflow/superuser等站点

阅读全文

与bash编程系列相关的资料

热点内容
dvd光盘存储汉子算法 浏览:757
苹果邮件无法连接服务器地址 浏览:962
phpffmpeg转码 浏览:671
长沙好玩的解压项目 浏览:142
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:732
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:301
PDF分析 浏览:484
h3c光纤全工半全工设置命令 浏览:141
公司法pdf下载 浏览:381
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:349
风翼app为什么进不去了 浏览:778
im4java压缩图片 浏览:362
数据查询网站源码 浏览:150
伊克塞尔文档怎么进行加密 浏览:890
app转账是什么 浏览:163