大数据入门之Linux基础(一)

 VmwareLinux 基础 

1 VMware 虚拟网络 

1.1 虚拟网卡、虚拟交换机 

当使用VMware Workstation安装一个虚拟机时就会自动安装一块虚拟网卡,此外还可手动给虚拟机添加多块虚拟网卡。

交换机用于电(光)信号的转发。可以为接入交换机的任意两个网络节点提

供独享的电信号通路。简单的理解可以把一些电脑连接在一起组成一个局域网。安装VMware Workstation 12时就自动安装了20台虚拟交换机。

 常用的交换机是VMnet0、VMnet1、VMnet8,分别对应VMware的三种网络模

式。

1.2 虚拟网桥 

网桥Bridge)是一个局域网与另一个局域网之间建立连接的桥梁。它是扩展网络和通信的手段,在各种传输介质中转发数据信号,扩展网络的距离。

VMware中,只有创建的虚拟机所使用的虚拟网卡连接到VMnet0虚拟交换机上才会应用虚拟网桥

1.3 虚拟 DHCP 服务器 

在虚拟网卡连接到VMnet1或VMnet8虚拟交换机时,自动安装运行虚拟DHCP 服务器并连接至这台虚拟交换机。

DHCP服务器: (Dynamic Host Configuration Protocol, 动态主机配置协议),主要有两个用途:

1. 给内部网络自动分配IP地址;

2. 作为对所有计算机作中央管理的手段。

1.4 虚拟 NAT 服务器 

只在虚拟网卡连接到 VMnet8 (NAT)虚拟交换机时才自动安装运行虚拟 NAT 服务器,并连接至这台虚拟交换机。

NAT服务器: (Network Address Translation, 网络地址转换)提供NAT 功能的服务器:就是把在内部网络中使用的IP地址转换成外部网络中使用的IP 地址,把不可路由的IP地址转化成可路由的IP地址,对外部网络隐蔽内部网。

1.5 主机虚拟网卡 

当我们安装VMware Workstation 12时,就会在我们的实体PC机器上安装主机虚拟网卡。

2 VMware 网络模式 

2.1 Bridged(桥接)

桥接模式下,宿主机物理网卡(主机网卡)和虚拟网卡通过VMnet0虚拟交换机进行桥接,物理网卡和虚拟网卡在拓扑图上处于同等地位,物理网卡和虚拟网卡处于同一个网段,虚拟交换机就相当于一台现实网络中的交换机,所以两个网卡的IP地址也要设置为同一网段。至于是桥接到宿主机的无线网卡还是有线网卡取决于宿主机上网模式。

 

2.2 Host-only (主机)

Host-Only模式下,虚拟系统网络是一个全封闭的网络,它唯一能够访问的就是宿主机,但各个虚拟机内部可以互相通信Host-Only网络和NAT网络很相似,不同的地方就是 Host-Only 网络没有 NAT 服务,所以虚拟网络不能连接到 Internet。宿主机和虚拟机之间的通信是通过VMware Network Adepter VMnet1 虚拟网卡来实现的。 

2.3 NAT(网络地址转换)

NAT模式下,虚拟机借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网

NAT网络中,会使用到VMnet8虚拟交换机,宿主机上的VMware Network

Adapter VMnet8虚拟网卡被连接到VMnet8交换机上,来与虚拟机进行通信,但是VMware Network Adapter VMnet8虚拟网卡仅仅是用于和VMnet8虚拟交换机网段通信用的,它并不为VMnet8网段提供路由功能,处于虚拟NAT网络下的虚拟机是使用虚拟的NAT服务器连接的Internet的 

这时候,虚拟机和宿主机就可以实现互访了,若此时宿主机已经连接到了

Internet,那么虚拟机也就可以连上 Internet 了。VMware Network Adapter

VMnet8虚拟网卡在这里仅仅是为Host和NAT虚拟网络下的虚拟机通信提供一个接口。所以,即便卸载掉这块虚拟网卡,虚拟机仍然是可以上网的,只是宿主机无法再访问VMnet8网段而已。

NAT模式下,宿主机需要开启VMware NAT Service和VMware DHCP Service。 

采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可。 如果你想利用VMware安装一个新的虚拟系统,在虚拟系统中不用进行任何手工配置就能直接访问互联网,

建议采用NAT模式。

3 VMware 虚拟机克隆 

VMware支持两种类型的克隆:完整克隆 链接克隆 

完整克隆是和原始虚拟机完全独立的一个拷贝,它不和原始虚拟机共享任何资源。可以脱离原始虚拟机独立使用。  

链接克隆需要和原始虚拟机共享同一虚拟磁盘文件,不能脱离原始虚拟机独立运行。但采用共享磁盘文件却大大缩短了创建克隆虚拟机的时间,同时还节省了宝贵的物理磁盘空间。通过链接克隆,可以轻松的为不同的任务创建一个独立的虚拟机。一般使用虚拟机克隆大量复制虚拟机,用来进行集群服务器的搭建

克隆后需要修改的地方:

1、 主机hostname

vi /etc/sysconfig/network 修改原hostname为 newname hostname newname  让hostname立刻生效

2、 虚拟网卡设备MAC地址

MAC地址处于下面两个文件中。

/etc/udev/rules.d/70-persistent-net.rules

/etc/sysconfig/network-scripts/ifcfg-eth0  

虚拟机虚拟网卡MAC地址可由下面进行设置:

3、 IP地址

可以编译下面的文件进行修改:

/etc/sysconfig/network-scripts/ifcfg-eth0

修改完之后,重启网络或者重启机器。新的虚拟机就可以使用了。

service network restart  

reboot 

4 SSH(安全外壳协议)

SSHSecure Shell的缩写,是一种网络安全协议,专为远程登录会话和其他网络服务提供安全性的协议。通过使用 SSH,可以把传输的数据进行加密,有效防止远程管理过程中的信息泄露问题。

从客户端来看,有两种验证方式:基于密码、基于密钥

4.1 用户名密码验证方式 

说明: 

(1) 当客户端发起ssh请求,服务器会把自己的公钥发送给用户;

(2) 用户会根据服务器发来的公钥对密码进行加密;

(3) 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功。

4.2 基于密钥的登录方式 

 说明:

(1) 首先在客户端生成一对密钥(公钥、私钥);

(2) 客户端将生成的公钥拷贝到需要访问的服务端机器上;

(3) 当客户端再次发送一个连接请求,包括ip、用户名;

(4) 服务端得到客户端的请求后,会到authorized_keys中查找,如果有相应的IP和用户,就会随机生成一个字符串,例如:qwer;

(5) 服务端将使用客户端拷贝过来的公钥对随机字符串qwer进行加密,然后发送给客户端;

(6) 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端;

(7) 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录。   

4.3 OpenSSH 使用 

OpenSSH是SSH协议的免费开源实现。

OpenSSH 由客户端和服务端的软件组成。服务端是一个守护进程(daemon),

他在后台运行并响应来自客户端的连接请求。服务端一般是sshd进程,提供了对远程连接的处理。

客户端包含ssh程序以及像scp(远程拷贝)、slogin(远程登陆)、sftp(安全文件传输)等其他的应用程序。

默认情况下,CentOS系统会自带安装OpenSSH服务。

  使用示例: 配置node-1至node-2机器的免密登录。

a) node-1机器上

ssh-keygen -t rsa [dsa] 按四下回车

生成密钥文件和私钥文件 id_rsa,id_rsa.pub b) 将公钥拷贝给node-2机器 ssh-copy-id node-2 

首次链接需要输入用户密码、验证成功后后续免密登陆。  

5 文件上传、下载 

在涉及Linux相关的开发中,经常需要进行linux和Windows之间的文件、安装包等上传和下载操作。sftp和lrzsz是使用比较广泛的两种方式。

5.1 SFTP

sftpSecure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp为 SSH的其中一部分,本身没有单独的守护进程,使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作。

SecureCRT远程连接至CentOS后,按alt+p即可打开sftp会话窗口

常用的sftp命令有: pwd和lpwd 

pwd是看sftp服务所在机器(即CentOS)默认的当前目录 lpwd是看Windows本地默认目录。

 ls和lls 

ls查看sftp服务器默认当前目录下内容 lls是看Windows默认当前目录下内容 

put d:/sparksql_textdata.csv  

Windows上文件上传到sftp服务器的默认当前目录下

get install.log.syslog 

sftp服务器当前目录下的文件下载到windows当前目录下  

Help 

帮助命令。列出sftp的使用方法。

5.2 lrzsz

lrzsz是一款在linux里可代替sftp上传和下载的程序

Centos系统中,可直接yum -y install lrzsz 程序会自动安装好,也可以下载安装包离线进行安装,详细参考附件资料。

上传文件:命令行输入rz,打开上传文件会话窗口。

 下载文件sz  下载文件路径

 

三、 Linux 增强 

1 查找命令 

1.1 grep

grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

格式:grep [option] pattern [file]  

可使用 —help 查看更多参数。

使用实例

ps -ef | grep sshd  查找指定ssh服务进程 ps -ef | grep sshd | grep -v grep 查找指定服务进程,排除gerp本身 ps -ef | grep sshd –c 查找指定进程个数 cat a.txt | grep -f b.txt  从文件中读取关键词进行搜索 输出a.txt文件中含有从b.txt文件中读取出的关键词的内容行

cat a.txt | grep –nf b.txt  从文件中读取关键词进行搜索,显示行号 grep -n 'linux' test.txt  从文件中查找关键词,并显示行号 cat test.txt |grep ^u   找出以u开头的行内容 cat test.txt |grep ^[^u]  输出非u开头的行内容 cat test.txt |grep hat$   输出以hat结尾的行内容 cat test.txt |grep -E "ed|at"  显示包含ed或者at字符的内容行

1.2 find

find命令在目录结构中搜索文件,并对搜索结果执行指定的操作。

find 默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。

实际参数很多,可使用 —help 查看。

使用实例

find . -name "*.log" -ls  在当前目录查找以.log结尾的文件,并显示详细信息。

find /root/ -perm 777   查找/root/目录下权限为777的文件 find . -type f -name "*.log"  查找当目录,以.log结尾的普通文件 find . -type d | sort   查找当前所有目录并排序 find . -size +100M  查找当前目录大于100M的文件

1.3 locate

locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的数据库。之后当寻找时就只需查

询这个数据库(/var/lib/locatedb)。

Linux系统自动创建这个数据库,默认每天自动更新一次,所以使用locate 命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,

先使用updatedb命令,手动更新数据库。

如果是精简版CentOS系统需要安装locate命令

yum -y install mlocate 

updatedb 命令来创建locate命令依赖的数据库

updatedb 

使用实例

locate /etc/sh 

搜索etc目录下所有以sh开头的文件

locate pwd 

查找和pwd相关的所有文件

  

1.4 whereis

whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。这些文件的属性应属于原始代码,二进制文件,或是帮助文件。

whereis和下locate一样,会从数据库中查找数据,而不是像find命令那

样,通过遍历硬盘来查找。

使用实例

whereis ls    将和ls文件相关的文件都查找出来 ls: /bin/ls /usr/share/man/man1/ls.1.gz whereis -m ls  查找ls命令说明文档路径 whereis -s ls  查找ls源文件  

1.5 which

which命令的作用是在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果

使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪

一个位置的命令。

使用实例

which pwd  查找pwd命令所在路径

/bin/pwd

which java  查找path中java的路径

/root/apps/jdk1.8.0_65/bin/java

which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档,所以,

不同的PATH配置内容所找到的命令会不一样。

  

2 susudo

2.1 su

su用于用户之间的切换。但是切换前的用户依然保持登录状态。如果是root 向普通或虚拟用户切换不需要密码,反之普通用户切换到其它任何用户都需要密码验证。

su在不加任何参数,默认为切换到root用户,但没有转到root用户根目录下;su 加参数 - ,表示默认切换到root用户,并转到root用户根目录下。

 

 

 

su不足:如果某个用户需要使用root权限、则必须要把root密码告诉此用户。

退出返回之前的用户:exit

 

  

2.2 sudo

sudo是为所有想使用root权限的普通用户设计的。可以让普通用户具有临时使用root权限的权利。只需输入自己账户的密码即可。当然这个普通用户必须在/etc/sudoers文件中有配置项、才具有使用sudo的权利。

没有配置权限之前,普通用户无法进行root权限操作:

 使用root用户编辑/etc/sudoers文件,给普通用户授权命令行输入visudo,打开/etc/sudoers文件,加入如下的内容,保存。

 这样普通用户就可以使用sudo执行root权限的命令了。

 sudo的工作过程如下: 

1.当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限

2.确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认

3.若密码输入成功,则开始执行sudo后续的命令如果想要更加精准的控制,就需要理解配置中的含义。

hadoop  ALL=(ALL)   ALL 

第一个ALL是指网络中的主机,我们可以指定主机名,这样hadoop只可以在此主机上执行后面的命令。第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令。最后一个ALL是指命令名了。

例如,我们想让hadoop用户在node-23主机上以allen的身份执行kill命令,就这样编写配置文件:

hadoop node-23=(allen) /bin/kill 

案例:只允许hadoop用户以root身份在node-23上执行ls 、cat命令,并且执行时候免输入密码。

配置文件中:

hadoop  node-23=NOPASSWD:  /bin/ls, /bin/cat 

 执行非ls 、cat命令也会禁止。

 cat命令就可以执行。

 

  

3 挂载(mount)命令 

linux操作系统中,挂载是指将一个设备(通常是存储设备)挂接到一个已存在的目录上。要访问存储设备中的文件,通过访问这个挂载目录来访问。

命令格式:mount [-t vfstype] [-o options] device dir 

-t vfstype 指定文件系统的类型mount 会自动选择正确的类型。常用类型有:光盘镜像iso9660、linux文件网络共享nfs等等。 -o options 主要用来描述设备或档案的挂接方式。常用的参数有:  loop:用来把一个文件当成硬盘分区挂接上系统  ro:采用只读方式挂接设备  rw:采用读写方式挂接设备

device 要挂接(mount)的设备 dir设备在系统上的挂接点(mount point) 

案例:挂载光驱

mkdir   /mnt/cdrom  mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom/ 将设备/dev/cdrom挂载到 挂载点/mnt/cdrom中案例:挂载光盘镜像文件(.iso)

  mkdir   /mnt/centos mount -o loop  /root/Centos-6.7.DVD1.iso  /mnt/centos 

案例:卸载umount

umount /mnt/cdrom 

4.本地 yum  

yumYellow dog Updater, Modified)是一个在Fedora和RedHat以及

CentOS中的Shell前端软件包管理器基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。

yum机制的强大之处在于yum源。yum源相当是一个目录项,当我们使用yum 机制安装软件时,若需要安装依赖软件,则yum机制就会根据在yum源中定义好的路径查找依赖软件,并将依赖软件安装好 yum源分为网络yum源本地yum源

yum源配置文件有两个。一是直接配置在/etc/yum.conf中,其中包含一些

主要的配置信息。另外就是/etc/yum.repos.d/下的 xx.repo后缀文件, 默认都

会被加载进来。

案例:使用CentOS镜像创建本地yum源

1、 挂载iso镜像,拷贝所有文件至本地yum目录

mkdir /dev/centios /mnt/local_yum mount -o loop /root/CentOS-6.7-x86_64-bin-DVD1.iso /dev/centios cp -r /dev/centios/* /mnt/local_yum/ 

2、 修改yum源配置  

cd /etc/yum.repos.d/  rename .repo .repo.bak *.repo cp CentOS-Base.repo.bak CentOS-Local.repo vi CentOS-Local.repo [local_yum] name=This is a local repo baseurl=file:///mnt/local_yum enabled=1 

gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6  

3、 更新yum配置

yum clean all 

yum repolist all  

通过上面的步骤操作,已经可以使用本地yum源了。有需要进行安装的软件

包就可以直接运行”yum install xxx“进行安装了。

5 系统服务管理 

service --status-all   # 查看系统所有的后台服务进程 service sshd status   # 查看指定的后台服务进程的状态

service sshd stop  service sshd start service sshd restart

配置后台服务进程的开机自启

chkconfig httpd on   ## 让httpd服务开机自启 chkconfig httpd off  ## 让httpd服务开机不要自启

 

6.网络管理 

6.1 主机名配置 

查看主机名

hostname

修改主机名(重启后无效)

hostname hadoop

修改主机名(重启后永久生效)

vi /ect/sysconfig/network

6.2 IP 地址配置 

方式一:setup

root输入setup命令,进入交互式修改界面

Minimal安装的系统没有安装 setuptool 软件,可yum安装后使用。

yum install setuptool ntsysv system-config-securitylevel-tui

yum install system-config-network-tui system-config-keyboard

方式二:修改配置文件(重启后永久生效)

vi /etc/sysconfig/network-scripts/ifcfg-eth0 

使修改文件的网络配置生效:

service network restart重启网络服务

reboot 重启计算机

方式三:ifconfig命令(重启后无效)

ifconfig eth0 192.168.12.22

6.3 域名映射 

/etc/hosts文件用于在通过主机名进行访问时做ip地址解析之用。所以,你想访问一个什么样的主机名,就需要把这个主机名和它对应的ip地址

配置在/etc/hosts文件中。

6.4 网络端口监听 

netstat是一款命令行工具,用于列出系统上所有的网络socket连接情况,包括 tcp, udp 以及 unix socket,另外它还能列出处于监听状态(即等待接入请求)的socket。如想确认Web 服务有没有起来,可查看80端口有没有打开。

示例

常见参数:

-a (all)显示所有选项,默认不显示LISTEN相关

-t (tcp)仅显示tcp相关选项 -u (udp)仅显示udp相关选项

-n 禁用域名反向解析功能,只显示ip

-l 仅列出有在 Listen (监听) 的服务状态

-p 显示建立相关链接的进程信息

-ep 可以同时查看进程名和用户名

netstat –nlpt 获取进程名、进程号以及用户 ID

 只列出监听中的连接

  netstat –tnl 可以看到处于监听状态的 TCP 端口和连接

7 crontab 配置 

crontab是Unix和Linux用于设置周期性被执行的指令。通过crontab命

令,可以在固定间隔时间执行指定的系统指令或shell脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。

crontab安装:  

yum install crontabs 

服务操作说明:

service crond start   ## 启动服务 service crond stop    ## 关闭服务 service crond restart ## 重启服务 service crond reload   ## 重新载入配置 service crond status    ## 查看crontab服务状态: chkconfig crond --list  ## 查看crontab服务是否已设置为开机启动  

chkconfig crond on      ## 加入开机自动启动

7.1 命令格式 

crontab [-u user] file crontab [-u user] [ -e | -l | -r ]

参数说明:

-u user:用来设定某个用户的crontab服务  file:file是命令文件的名字,表示将file做为crontab的任务列表文件

并载入crontab。

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前

用户的crontab文件。

-l:显示某个用户的crontab文件内容。如果不指定用户,则表示显示当前

用户的crontab文件内容。

-r:删除定时任务配置,从/var/spool/cron目录中删除某个用户的crontab

文件,如果不指定用户,则默认删除当前用户的crontab文件。 -i:在删除用户的crontab文件时给确认提示。 

命令示例

crontab file [-u user] ## 用指定的文件替代目前的crontab。  crontab -l [-u user]  ## 列出用户目前的crontab.  crontab -e [-u user]  ## 编辑用户目前的crontab.

7.2 配置说明、实例 

*  *  *  *  *  command  

         命令  1列表示分钟1~59 每分钟用*或者 */1表示  第2列表示小时0~23(0表示0点)第3列表示日期1~31  第4列表示月份1~12  第5列标识号星期0~6(0表示星期天)  第6列要运行的命令配置实例

*/1 * * * * date >> /root/date.txt

每分钟执行一次date命令

30 21 * * * /usr/local/etc/rc.d/httpd restart  

每晚的21:30重启apache。  

45 4 1,10,22 * * /usr/local/etc/rc.d/httpd restart  

每月1、10、22日的4 : 45重启apache。  

10 1 * * 6,0 /usr/local/etc/rc.d/httpd restart  

每周六、周日的1 : 10重启apache。  

0,30 18-23 * * * /usr/local/etc/rc.d/httpd restart  

每天18 : 00至23 : 00之间每隔30分钟重启apache。  

* 23-7/1 * * * /usr/local/etc/rc.d/httpd restart  

晚上11点到早上7点之间,每隔一小时重启apache  

 

四、 Shell 编程 

Shell是一个用C语言编写的程序,通过Shell用户可以访问操作系统内核服务。它类似于DOS下的command和后来的cmd.exe。Shell既是一种命令语言,又是一种程序设计语言

Shell script是一种为shell编写的脚本程序。Shell 编程一般指 shell 脚本编程,不是指开发shell自身。

Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 种类众多,一个系统可以存在多个 shell,可以通过 cat 

/etc/shells命令查看系统中安装的shell

Bash由于易用和免费,在日常工作中被广泛使用。同时,Bash也是大多数

Linux系统默认的Shell

1 基本格式 

使用vi编辑器新建一个文件 hello.sh。扩展名并不影响脚本执行,见名知意。比如用 php写shell脚本,扩展名就用 .php。

#!/bin/bash 

echo "Hello World !" 

#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell

echo 命令用于向窗口输出文本。

Shell脚本的执行:

chmod +x ./hello.sh    #使脚本具有执行权限

./hello.sh     #执行脚本

直接写hello.sh,linux 系统会去 PATH 里寻找有没有叫hello.sh 的。用 ./hello.sh 告诉系统说,就在当前目录找。

还可以作为解释器参数运行。直接运行解释器,其参数就是 shell 脚

本的文件名,如:

/bin/sh /root/hello.sh 

/bin/php test.php

这种方式运行脚本,不需要在第一行指定解释器信息,写了也不生效。

2 Shell 变量 

2.1 语法格式 

变量=值,如:your_name="itcast.cn"

注意:变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则: 

首个字符必须为字母(a-zA-Z 

中间不能有空格,可以使用下划线(_ 

不能使用标点符号 

不能使用 bash 里的关键字(可用 help 命令查看保留关键字) 

2.2 变量使用 

使用一个定义过的变量,只要在变量名前面加 $ 即可。 

your_name="itcast.cn" echo $your_name 

echo ${your_name} 

花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。

已定义的变量,可以被重新定义。

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

使用 unset 命令可以删除变量。不能删除只读变量。

   readonly variable_name unset variable_name 

2.3 变量类型 

局部变量 局部变量在脚本或命令中定义,仅在当前 shell 实例中有效,其

shell启动的程序不能访问局部变量。

环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。可以用过set命令查看当前环境变量

shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。

3 Shell 参数传递 

在执行 Shell 脚本时,可以向脚本传递参数。

脚本内获取参数的格式为:$nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… $0表示当前脚本名称

3.1 特殊字符 

$#

传递到脚本的参数个数

$*

以一个单字符串显示所有向脚本传递的参数。

$$

脚本运行的当前进程ID号

$!

后台运行的最后一个进程的ID号

$@

与$*相同,但是使用时加引号,并在引号中返回每个参数。

$?

显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

例子: 

#!/bin/bash

echo "第一个参数为:$1";

echo "参数个数为:$#";

echo "传递的参数作为一个字符串显示:$*";

 

执行脚本:./test.sh 1 2 3

3.2 $*$@区别 

相同点:都表示传递给脚本的所有参数。

不同点

不被" "包含时,$*和$@都以$1 $2… $n 的形式组成参数列表。

" "包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n" 的形式组成一个整串;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式组成一个参数列表。

4 Shell 运算符 

Shell和其他编程语音一样,支持包括:算术、关系、布尔、字符串等运算符。原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 expr。expr 是一款表达式计算工具,使用它能完成表达式的求值操作

例如,两个数相加:

val=`expr 2 + 2` 

echo $val 

注意表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2。完整的表达式要被 ` ` 包含,注意不是单引号,在 Esc 键下边。详细请参考附件资料《shell运算符》。

此外,还可以通过(())、$[]进行算术运算

count=1 ((count++)) echo $count a=$((1+2)) 

a=$[1+2] 

5 流程控制 

5.1 if else

if condition1 then     command1 

elif condition2  then      command2 else 

    commandN 

fi 

5.2 for

方式一

for N in 1 2 3 do  echo $N done  

for N in 1 2 3; do echo $N; done 

 

for N in {1..3}; do echo $N; done 方式二

for ((i = 0; i <= 5; i++)) do  echo "welcome $i times" done  

for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done 

5.3 while

方式一

while expression do command 

 

done 方式二

i=1 while ((i<=3)) do   echo $i   let i++ done

let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。自加操作:let no++  自减操作:let no— 方式三:无限循环

while true do     command done 

5.4 case

case  in 

模式 1) 

    command1     command2 

    ... 

    commandN 

    ;; 

模式 2 

    command1     command2 

    ... 

    commandN 

    ;; esac 

6 函数使用 

所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至

shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可

[ function ] funname [()] 

{     action; 

    [return int;] 

} 

1、 可以带function fun()定义,也可以直接fun() 定义,不带任何参数。

2、 参数返回,可以显示加return ,如果不加,将以最后一条命令运行结

果,作为返回值。 return后跟数值n(0-255)。

6.1 函数参数 

Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数... 注意,n>=10时,需要使用${n}来获取参数

funWithParam(){

    echo "第一个参数为 $1 !"     echo "第二个参数为 $2 !"     echo "第十个参数为 $10 !"     echo "第十个参数为 ${10} !"     echo "第十一个参数为 ${11} !"     echo "参数总数有 $# 个!"     echo "作为一个字符串输出所有参数 $* !"

} funWithParam 1 2 3 4 5 6 7 8 9 34 73 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页