bash特性、bash编程

bash基础特性:

命令行展开:~,{}

命令别名:alias,unalias

命令历史:history

命令和路径补全:$PATH

glob通配符:*,?,[],[^],

快捷键:Ctrl+{a,e,l,c,u,k}

命令hash:

 

bash通配符及特殊符号:

通配符:

?:任意一个字符;

*:匹配任意个任意字符;

[]:匹配括号内的任意一个字符;

[^]:匹配非括号内的任意一个字符

特殊字符:

‘ ‘:单引号中,所有特殊字符都没有特殊含义;

” “:双引号中,除$(调用变量的值)、`(命令引用)、\(转义符)外,其他特殊字符没有特殊含义;

` `:等同于$();达到命令引用,即先执行本处命令;

\:转义符,使跟\之后的特殊字符失去特殊含义;

$:调用变量的值;

#:在shell脚本中,#开头的行代表注释

 

 

bash脚本:

运行脚本:1、给予执行权限,通过具体的文件路径指定文件执行;

2、直接运行解释器,将脚本作为解释器程序的参数运行;

 

数据类型:

一、字符

二、数值

1、整型

2、浮点型

(1)、单精度浮点型

(2)、双精度浮点型

3、布尔型

 

bash中的算术运算:man let

+,-,*,/,%

 

实现算术运算:(乘法符号有些场景中需转义\)

1、let var=算术表达式;例如 let sum=$num1+$num2

2、var=$[算术表达式];例如 echo $[$num1+$num2]

3、var=$((算术表达式));例如echo $(($num1+$num2))

4、var=$(expr arg1 arg2 arg3 …);例如sum=$(expr $num1 + $num2)

 

bash内建的随机数生成器:$RANDOM;

例如取出0-60之间# echo $[$RANDOM%60+1]

 

增强型赋值:man let;自增、自减:

+=,-=,*=,/=,%=

例如let count+=1、let count++

 

条件测试:判断某需求是否满足,需要有测试机制来实现;

测试命令:

test EXPRESSION

[ EXPRESSION ]

[[ EXPRESSION ]]

 

bash的测试类型:

一、数值测试:

-gt:大于;

-lt:小于;

-ge:大于等于;

-le:小于等于;

-eq:等于;

二、字符串测试:(注意:用于字符串比较的操作数要使用引号)

==:等于;

>:大于;

<:小于;

!=:不等于;

=~:左侧字符串是否被右侧pattern所匹配;此表达式一般用于[[ ]]中;

-z “string”:字符串是否为空,空则为真,不空则为假;

-n “string”:字符串是否非空,非空为真,空则为假;

三、文件测试:(man bash)

-e file:存在测试;

-b file:存在且为块设备文件;

-c file:存在且为字符设备文件;

-d file:存在且为目录文件;

-f  file:存在且为普通文件;

-g file:存在且拥有sgid权限;

-u file:存在且拥有suid权限;

-k file:存在且拥有sticky权限;

-r file:存在且可读;

-w file:存在且可写;

-x file:存在且可执行;

-s file:存在且非空;

-t fd:fd表示文件描述符是否已经打开且与某终端相关;

file1 -ef file2:是否为同一个设备上的相同inode;

file1 -nt file2:file1是否新于file2;

file1 -ot file2:file1是否旧于file2;

 

组合测试条件:

第一种方式:

command1 && command2

command1 || command2

! command

例如:[ -z “$(hostname)” ] || [ “$(hostname)” == “localhost.localdomain” ]

第二种方式:

expression1 -a expression2

expression1 -o expression2

! expression

例如:[ -z “$(hostname)” -o “$(hostname)” == “localhost.localdomain” ]

 

bash自定义退出状态码:

exit [n]:自定义退出状态码;

注意:脚本中一旦遇到exit命令,脚本会立即终止;终止状态码取决于exit命令后的数字;

注意:如果未给脚本指定状态退出码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码;

 

bash编程之用户交互:

read -p “提示语” 变量名

 

 

bash脚本编程:

整数值比较:-ge 大于等于; -gt 大于; -eq 相等; -lt 小于; -ne 不相等;-le小于等于

 

顺序执行

选择执行:if、case

循环执行:for、while、until

函数:结构化编程及代码重用;function

 

选择执行:if语句(逐条件进行判断;第一次遇到为“真”条件时,执行其分支,而后结束)

单分支:

if 判断条件;then

条件为真的分支代码

fi

双分支:

if 判断条件;then

条件为真的分支代码

else

条件为假的分支代码

fi

多分支:

if 判断条件1;then

条件为真的分支代码

elif 判断条件2;then

条件为真的分支代码

elif 判断条件3;then

条件为真的分支代码

else

条件为假的分支代码

fi

 

case语句

case $变量名 in

模式1)

命令序列1

;;

模式2)

命令序列2

;;

*)

默认执行的命令序列

;;

esac

 

bash编程之for语句

循环执行:for语句

for 变量 in 列表;do

循环体

done

 

for循环的特殊格式:

for ((控制变量初始化;条件判断表达式;控制变量的修正表达式));do

循环体

done

控制变量初始化:仅在运行到循环代码段时执行一次;

控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断;

 

列表生成方式:

(1)直接给出列表;例如 for i in 1 2 3 4;then…

(2)整数列表:

(a){start..end};例如{1..10}代表1-10;

(b)$(seq [start [step]] end);例如:$(seq 1 2 10),代表10以内的奇数;

(3)返回列表的命令:$(COMMAND);例如$(ls /var)代表对列出/var目录下的文件列表;

(4)glob通配符

 

while语句:当条件为true时进入循环,条件为false时退出循环;

while 条件;do

循环体

done

while循环的特殊用法(遍历文件的每一行):依次读取/path/to/somefile文件中的每一行,且将行赋值给变量line;

while read line;do

循环体

done < /path/to/somefile

 

until语句:当条件为false时进入循环,条件为true时退出循环;

until 条件;do

循环体

done

 

创建死循环:

while true;do

循环体

done

until false;do

循环体

done

 

循环控制语句(用于循环体)

continue [n]:提前结束第n层的本轮循环,而直接进入下一轮判断;

break [n]:提前结束循环;

 

function函数

语法一:

function f_name {

函数体。。。

}

语法二:

f_name () {

函数体。。。

}

 

bash脚本编程:

变量:存储单个元素的内存空间;

数组:存储多个元素的连续的内存空间;

数组名

索引:编号从0开始,属于数值索引;注意:索引也可以使用自定义的格式,而不仅仅是数值格式;

bash的数组支持稀疏格式;

引用数组中的元素:${ARRAY_NAME[INDEX]}

数组长度(数组中元素的个数):

${#ARRAY_NAME[*]}、${#ARRAY_NAME[@]}

引用所有元素

${ARRAY_NAME[*]}、${ARRAY_NAME[@]}

 

取出特定元素:数组切片

${ARRAY_NAME[@]:offset:number}

offset:要跳过的元素个数

number:要取出的元素个数;去偏移量之后的所有元素:${ARRAY_NAME[@]:offset};

 

声明数组:

declare -a ARRAY_NAME

declare -A ARRAY_NAME:关联数组:

数组元素的赋值方式:

(1)一次只赋值一个元素:

ARRAY_NAME[INDEX]=VALUE

(2)一次赋值全部元素:

ARRAY_NAME=(“VALUE1” “VALUE2″ …)

(3)只赋值特定元素:

ARRAY_NAME=([0]=”VALUE1″ [3]=”VALUE3” …)

(4)让用户输入元素

read -a ARRAY

 

例子:随机生产10个数保存于数组中,找出最大和最小值;

declare -a nums
declare -i max=0
declare -i min=0

for i in {0..9};do
nums[$i]=$RANDOM
echo ${nums[$i]}
if [ $i -eq 0 ];then
min=${nums[$i]}
max=${nums[$i]}
else
if [ ${nums[$i]} -gt $max ];then
max=${nums[$i]}
fi
if [ ${nums[$i]} -lt $min ];then
min=${nums[$i]}
fi
fi
done
echo “max: $max”
echo “min: $min”

 

向数组中追加元素:ARRAY[${#ARRAY[*]}]

删除数组中的某元素:unset ARRAY[INDEX]

关联数组:

declare -a ARRAY_NAME

ARRAY_NAME=([index_name1]=”VALUE1″     [index_name2]=”VALUE2″    …)

 

bash的字符串处理工具:

字符串切片:

${var:offset:number}:

offset:要跳过的字符串个数

number:要取出的字符串个数;去偏移量之后的所有字符串:${ARRAY_NAME[@]:offset};

取字符串的最右侧几个字符:${var:  -lengh};注意冒号后面必须有一空白字符;

基于模式去子串:

${var#*word}:其中word可以是指定的任意字符;功能:自左而右,查找var变量所存储的字符串中,第一次出现的word,删除字符串开头至第一次出现word字符之间的所有字符;

${var##*word}:其中word可以是指定的任意字符;功能:自左而右,查找var变量所存储的字符串中,最后一次出现的word,删除字符串开头至最后一次出现word字符之间的所有字符;

 

${var%word*}:其中word可以是指定的任意字符;功能:自右而左,查找var变量所存储的字符串中,第一次出现的word,删除字符串最后一个字符向左至第一次出现word字符之间的所有字符;

${var%word*}:其中word可以是指定的任意字符;功能:自右而左,查找var变量所存储的字符串中,第一次出现的word,删除字符串最后一个字符向左至最后一次出现word字符之间的所有字符;

例子:url=http://www.lewis.com:80

${url##*:}:80

${url%%:*}:http

 

查找替换:

${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替换之;

${var//pattern/substi}:查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替换之;

${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替换之;

${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替换之;

 

查找并删除:

${var/pattern}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,删除之。

${var//pattern}:查找var所表示的字符串中,所有被pattern所匹配到的字符串,删除之。

${var/#pattern}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,删除之。

${var/%pattern}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,删除之。

 

字符大小写转换:

${var^^}:把var中的所有小写字母转换成大写;

${var,,}:把var中的所有大小字母转换成小写;

 

变量赋值:

${var:-value}:如果var为空或未设置,那么返回value;否则,则返回var的值;

${var:=value}:如果var为空或未设置,那么返回value,并将value赋值给var;否则,则返回var的值;

${var:+value}:如果var非空,则返回value;

${var:?error_info}:如果var为空或未设置,那么返回error_info;否则,则返回var的值;

 

为脚本程序使用配置文件:

定义文本文件,每行定义“name=value”

在脚本中source此文件即可

 

mktemp命令:创建临时文件或目录

-d:创建临时目录

–tmpdir:指明临时文件目录位置

例子:mktemp /tmp/test.XXX

 

install命令:功用类似cp命令

install [OPTION]… [-T] SOURCE DEST
install [OPTION]… SOURCE… DIRECTORY
install [OPTION]… -t DIRECTORY SOURCE…
install [OPTION]… -d DIRECTORY…

-m MODE:指明权限

-o OWNER:指明属主

-g GROUP:指明属组

 

ldd:查找某命令文件所依赖的共享库

ldd [OPTION]… FILE…

 

练习:写一个脚本

(1)提示用户输入一个可执行命令名称;

(2)获取此命令所依赖到的所有库文件列表;

(3)复制命令至某目录(例如/mnt/sysroot)下的对应路径下;

(4)复制此命令依赖到的所有库文件至目标目录下的对应路径下;

进一步:每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成完成上述功能:直到用户输入quit退出;

#!/bin/bash
#
ch_root=”/mnt/sysroot”
cmdcp() {
if which $1 &> /dev/null;then
cmd_path=$(which –skip-alias $1)
cmd_dir=$(dirname ${cmd_path})
[ -d ${ch_root}${cmd_dir} ] || mkdir -p ${ch_root}${cmd_dir}
[ -f ${ch_root}${cmd_path} ] || cp ${cmd_path} ${ch_root}${cmd_dir}
return 0
else
echo “command not found.”
return 1
fi
}
libcp() {
lib_list=$(ldd /usr/bin/bash | grep -o ‘/[^[:space:]]\+’)
for i in $lib_list;do
lib_dir=$(dirname $i)
[ -d ${ch_root}${lib_dir} ] || mkdir -p ${ch_root}${lib_dir}
[ -f ${ch_root}$i ] || cp $i ${ch_root}${lib_dir}
done
}
read -p “please input a command:” command
until [ $command == “quit” ];do
if cmdcp $command ;then
libcp$command
echo “job $command is finish”
read -p “please input a command:” command
else
read -p “please input a command:” command
fi
done

 

 

 

 

 

 

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/92777

(1)
N26-深圳-城市蜗牛N26-深圳-城市蜗牛
上一篇 2018-03-21
下一篇 2018-03-21

相关推荐

  • 位置变量$1,$2,$@,$*,$#详解

    位置变量: 位置变量实际是属于系统预定义变量的一种,不能修改变量名,同时作用也是固定的,也不能新增的变量,只能修改变量的值。     常用的位置参数变量        $0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号括起来,比如${11}.     该变…

    Linux干货 2016-08-18
  • Hadoop伪分布式模型

    # java -version # vim /etc/profile.d/java.sh export JAVA_HOME=/usr # yum install java-1.8.0-openjdk-devel # mkdir /bdapps # tar xf hadoop-2.7.4.tar.gz -C /bdapps/ # cd /bdapps # ln…

    2017-12-08
  • AMERICAN GIRL 2025 GIRL OF THE YEAR SUMMER MCKINNY

    Baby Boy Names You Will Love 2024 The report includes the change in popularity, and the database allows you to search by the name and the year. The list typically comes out in May …

    Linux干货 2025-05-08
  • ansible实战示例

    要求:     使用ansible部署以下任务:     (1) 在VS部署主/备模型的keepalived + nginx的负载均衡;     (2) 在RS主机上部署httpd + php + php-mysql;     (3) 在第五台主机上部署mariadb-serve…

    Linux干货 2016-11-11
  • 关于大型网站技术演进的思考(七):存储的瓶颈(7)

    原文出处: 夏天的森林  本文开篇提个问题给大家,关系数据库的瓶颈有哪些?我想有些朋友看到这个问题肯定会说出自己平时开发中碰到了一个跟数据库有关的什么什么问题,然后如何解决的等等,这样的答案没问题,但是却没有代表性,如果出现了一个新的存储瓶颈问题,你在那个场景的处理经验可以套用在这个新问题上吗?这个真的很难说。 其实不管什么样的问题场景最…

    2015-03-11