1、常用命令bash特性命令介绍:
hash命令
作用:缓存此前命令的查找结果,缓存外部命令,不能缓存内嵌命令;加快程序运行
用法:他是一个内嵌命令
[root@localhost ~]# hash//查看此前运行过的命令的查找结果
hitscommand
1/usr/bin/grep
[root@localhost ~]#
[root@localhost ~]# hash -d command //删除命令(command)的查找结果
[root@localhost ~]# hash -r//清空hash列表,一般用来当命令被移动到其他位置时,需要清空
bash多命令执行:
各命令间用分号(;)隔开,命令间无逻辑关系,一次执行
多命令格式:
~]#command1;command2;command3 ....
如:
[root@localhost ~]# ls;cat /etc/issue
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
\S
Kernel \r on an \m
[root@localhost ~]#
bash特性之逻辑关系:
运算数:
真表示方法:true、yes、on、1
假表示方法:false、no、off、0
运算方法:
与:&& ;1&&1=1,1&&0=0,0&&1=0,0&&0=0
或:|| ;1||1=1,1||0=1,0||1=1,0||0=0
非:! ;!1=0,!0=1
与短路运算:如果前一个执行结果为假,则结果为假;
或短路运算:如果前一个执行结果为真,则结果为真;
~]command1 && command2 && 。。。
命令执行状态结果作为与运算,与运算中,前一个命令执行失败,后面的命令将不再执行;若前一个命令执行成功,则执行后一个命令;command1执行失败,不在执行comamnd2;反之则需执行command2
~]command1 || command2 || 。。。
命令执行状态结果作为或运算,或运算中,前一个命令执行失败,后面的命令必须执行;若前一个命令执行成功,则不再执行后一个命令;command1执行失败,必须执行comamnd2;反之则不再执行command2
如:
[root@localhost ~]# touch /tmp/test.etc && ls /etc/ > /tmp/test.etc
如果创建test.etc的状态结果为真,则执行后面命令:ls /etc/ > /tmp/test.etc
[root@localhost ~]# id lucy || useradd lucy
id: lucy: no such user
[root@localhost ~]# tail -1 /etc/passwd
lucy:x:2008:2008::/home/lucy:/bin/bash
[root@localhost ~]#
2、bash变量介绍
程序是由指令+数据组成的;也可以看成是由算法+数据结构组成。
其中,指令由程序文件提供,数据由标准输入(I/O)、文件、管道、变量等提供。
变量:由变量名和内存空间组成,他是一个有命名的内存地址。
变量根据编程语言分类:
强类型变量:不同变量类型不能相互操作,除非做变量类型转换
弱类型变量:bash就是一种弱类型变量的编程语言;bash不支持浮点数据类型,除非借助外在工具;bash中的变量无需事先声明,这样就相当于把变量声明和赋值过程同时实现。
在强类型编程语言中,如c语言,变量需要初始化,因为变量中有随机数。
变量替换(变量引用):把变量名出现的位置,替换为其所指向的内存空间的数据。
变量引用方法:${var_name}或$var_name,建议用前者${var_name}规范写法。
3、bash变量分类:
根据作用范围划分:
本地变量:作用域为当前shell进程;同级shell或子shell不起作用;
环境变量:作用域为当前shell进程及子进程;同级shell进程无效;
局部变量:作用域为某代码片段;
其他分类:
位置参数变量:向执行脚本的shell进程传递的参数
特殊变量:shell内置的特殊功用的变量,如:$?、
4、bash变量定义:
变量名命名法则:
见名知意,
不能使用程序的保留字,如if、else、then、while等。
4.1、本地变量
本地变量定义:
name=value
本地变量引用:
${var_name}或$var_name
"var_name" :弱引用,变量名会被替换成变量值
'var_name' :强引用,变量名不会被替换成值
如:
[root@localhost ~]# name=lucy//定义本地变量
[root@localhost ~]# echo $name//引用变量
lucy
[root@localhost ~]# echo "name"
name
[root@localhost ~]# echo 'name'
name
[root@localhost ~]#
查看本地变量:
#set
撤销本地变量:
#unset 变量名//注意此处非变量引用,无需"$"符号
如:
[root@localhost ~]# unset name
[root@localhost ~]# echo $name
[root@localhost ~]#
验证本地变量作用域方法:
①打开一个统计shell进程,查看变量值
②打开一个子shell进程,查看变量值。如:在bash提示符下直接输入bash(新建一个shell子进程),看看变量值是否可以被引用。
4.2、环境变量
环境变量定义:
方法一:export name=value
方法二:name=value
export name
方法三:declare -x name=value
方法四:name=value
declare -x value
注意:declare是内嵌命令。同时,bash内嵌了许多环境变量,通常为全大写字母,因此为了避免自定义和内置的环境冲突,不建议定义环境变量时大写。
PATH\HISTFILE\HISTSIZE\HISTFILESIZE\HISTCONTROL\SHELL\HOME\UID\PWD\OLDPWD
环境变量引用:
${var_name}或$var_name
查看环境变量:
方法一:export
方法二:declare -x
方法三:printenv
方法四:env
如:
[root@localhost ~]# export price=12
[root@localhost ~]# echo $price
12
[root@localhost ~]# bash
[root@localhost ~]# echo $price
12
[root@localhost ~]# exit
exit
[root@localhost ~]# export
declare -x XMODIFIERS="@im=ibus"
declare -x price="12"
[root@localhost ~]#
撤销环境变量:
#unset var_name
定义只读变量:
方法一:declare -r var_name
方法二:readonly var_name
[root@localhost ~]# declare -r price
[root@localhost ~]# unset price
bash: unset: price: cannot unset: readonly variable
[root@localhost ~]#
[root@localhost ~]# readonly name=lili
[root@localhost ~]# unset name
bash: unset: name: cannot unset: readonly variable
[root@localhost ~]#
注意:变成只读变量后将无法撤销变量,变量存活时间为当前shell进程的生命周期,随shell终止而终止。
5、shell脚本编程介绍:
编程语言分类1:(根据运行方式)
解释运行:将源代码 经 解释器解释 边解释边运行。
编程语言分类2:根据其编程过程中功能的实现是调用库,还是调用外部的程序文件,又分如下两种:
shell脚本编程:利用系统上的命令及编程组件进行编译
完整编程:利用库或编程组件进行编程。
面向过程式的编程语言:以指令为中心来组织代码,数据服务于代码;顺序执行、选择则行、循环执行等,代表:c语言、bash脚本、c++、python
面向对象的编程语言:以数据为中心来组织代码,围绕数据来组织指令;类、实例化话对象,代表:java、c++、python
shell脚本编程特性:
过程式编程语言
脚本语言、解释执行、依赖于外部程序文件运行。
5.1、shell脚本写法:
脚本文件第一行:顶格#!shebang //解释器路径,用于指明解释执行当前脚本的解释程序文件。
常见的shebang(解释器)有:
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
脚本写法事例:
[root@localhost ~]# cat first.sh
#!/bin/bash
id lily || useradd -M lily
id lily
[root@localhost ~]#
shell脚本如何写?
命令的堆积
很多命令不具备幂等性,需要用程序逻辑来判断运行条件是否满足,以避免其运行中发现的错误。
shell脚本的执行方法:
方法一:赋权执行权限,并直接运行此程序。
~]#chmod +x /path/shell.sh //给脚本文件shell.sh加上执行权限
~]#/path/to/shell.sh//给出shell脚本文件shell.sh完整路径执行;
或~]#./shell.sh//也可以以相对路径执行
方法二:直接运行解释器,将脚本以命令行参数传递给解释器程序
~]#bash shell.sh//可以是绝对路径,也可以是相对路径。
注意:脚本中的空白行会被解释器忽略,脚本中,除了shebang,余下所有以#开头的行,都会被视作注释行而被忽略,此即为注释行。
练习:
用脚本实现如下功能:
1>显示/etc/目录下所有以大写p或小写p开头的文件或目录本身
2>显示/var目录下的所有文件或目录本身,并将显示结果中的小写字母转换成大写字母后显示;
3>创建临时文件/tmp/myfile.xxxx
[root@localhost ~]# nano secondshell.sh
#!/bin/bash
ls -d /etc/[pP]*
ls -d /var/* | tr 'a-z' 'A-Z'
mkdir /tmp/myfile.xxxx
6、bash脚本编程之算术运算:(+、-、*、/、**、%)
注意:bash中所有的数字都被视为字符串。
如:
[root@localhost ~]# var1=2
[root@localhost ~]# var2=10
[root@localhost ~]# echo "$var1+$var2"
2+10
[root@localhost ~]#
算术运算格式:
方法一:let var_name=算术表达式
方法二:$[算数表达式]
方法三:var=$((算术运算表达式))
方法四:$(export $ARG1 OP $ARG2)//不好用,也不常用
需要注意的是:乘法符号(*)在有些场景中需要使用转义符。
如:
[root@localhost ~]# var1=2
[root@localhost ~]# var2=10
方法一:
[root@localhost ~]# let sum=$var1+$var2
[root@localhost ~]# echo $sum
12
[root@localhost ~]#
方法二:
[root@localhost ~]# echo $[$var1+$var2]
12
[root@localhost ~]#
[root@localhost ~]# echo "$[$var1+$var2]"//变量弱引用
12
[root@localhost ~]# echo '$[$var1+$var2]'//变量强引用
$[$var1+$var2]
[root@localhost ~]#
方法三:
[root@localhost ~]# sum1=$(($var1+$var2))
[root@localhost ~]# echo $sum1
12
[root@localhost ~]#
[root@localhost ~]# echo "$(($var1+$var2))"
12
[root@localhost ~]#
方法四:
[root@localhost ~]# echo $(expr $var1 + $var2 )
12
[root@localhost ~]#
练习:写一个脚本,完成如下功能:
2>求三个用户的UID之和
[root@localhost ~]# nano third.sh
#!/bin/bash
id sh1 || useradd sh1
id sh2 || useradd sh2
id sh3 || useradd sh3
shid1=$(grep "sh1" /etc/passwd |cut -d: -f3)
shid2=$(grep "sh2" /etc/passwd | cut -d: -f3)
shid3=$(grep "sh3" /etc/passwd | cut -d: -f3)
let shidsum=$shid1+$shid2+$shid3
echo $shidsum
[root@localhost ~]# bash third.sh
id: sh1: no such user
id: sh2: no such user
id: sh3: no such user
6033
[root@localhost ~]#
[root@localhost ~]# tail -3 /etc/passwd
sh1:x:2010:2010::/home/sh1:/bin/bash
sh2:x:2011:2011::/home/sh2:/bin/bash
sh3:x:2012:2012::/home/sh3:/bin/bash
[root@localhost ~]#
注意:命令的结果引用
~]#命令1 $(命令2)//表示:命令2的执行结果作为参数传递给命令1使用
原文链接:https://www.f2er.com/bash/390183.html