谢烟客---------Linux之bash编程

简介:

数组

wKioL1m4vYHidlQVAAA4SIobYQM360.png


数组名

wKioL1m4vcjgjKBsAAAWDCiEdu0044.png


数组定义

wKioL1m4vnmhNRQYAAAqYzc8dBI109.png


数组引用

wKioL1m4vumy5DHGAAAOQaM2cH0019.png

wKiom1m4vxKTZ3QWAAAPXO4WFLc688.png


wKioL1m4vyDzyJvxAAAQZnkOBjA629.png

wKiom1m4v3DwIzhOAAANVLkGOoU152.png


wKiom1m4v0qDay9NAAAPWdRj_XQ262.png

wKioL1m4v3vg-pkTAAAQa-QshRk862.png


wKioL1m4vyGhOz6GAAAe0UWV24Q660.png


wKiom1m4v0rDJhgbAAAZhuWIT8E599.png

wKiom1m4wAzSYDjhAAAU2PjbwvQ807.png


数组元素的赋值方式

wKioL1m4wa-C9uAVAAATBtnM1ZU581.png

wKioL1m4wa_CHY3zAAAqTlLmvZw375.png

wKiom1m4wdjyfqtEAAAslo_Y7L0656.png

wKioL1m4wfzjqZjkAAAzRhbbzH0252.png

wKioL1m4wbCweTH1AAAbLLzd3R0606.png


销毁数组

1
unset ARRAY_NAME[INDEX]


练习:生成10个随机数保存于数组中,取出最大值和最小值

练习:生成10个随机数保存于数组中,求下标为偶数的所有随机数之和

练习:写一个脚本 定义一个数组,数组中的元素是/var/log目录下所有以.log结尾的文件名;要统计其下标为偶数的文件中的行数之和

练习:生成10个随机数,对其排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
示例一:生成 10 个随机数保存于数组中,取出最大值和最小值
#!/bin/bash
#
 
declare -a rand
declare -i max=
declare -i min=
for  in  { 0 .. 9 };  do
     rand[$i]=$RANDOM
     echo ${rand[$i]}
     
     if  [ $i -eq  0  ]; then
         max=${rand[$i]}
         min=$max
     fi
 
     if  [ $max -lt ${rand[$i]} ]; then
         max=${rand[$i]}
     fi
 
     if  [ $min -gt ${rand[$i]} ]; then
         min=${rand[$i]}
     fi
done
 
echo  "max: $max"
echo  "min: $min"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
示例一:生成10个随机数保存于数组中,求下标为偶数的所有随机数之和
#!/bin/bash
#
 
declare  -a rand
declare  -i  sum =0
for  in  {0..9};  do
     rand[$i]=$RANDOM
     echo  ${rand[$i]}
     if  [ $[$i%2] - eq  0 ];  then
         let  sum +=${rand[$i]}
     fi
done       
 
echo  "sum: $sum"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
练习:写一个脚本
定义一个数组,数组中的元素是/ var /log目录下所有以.log结尾的文件名;要统计其下标为偶数的文件中的行数之和
#!/bin/bash
#
declare -a file_name
file_name=(/ var /log/*.log)  ## ARRAY_NAME=(  "val1"  "val2"  "val3"  ...) 仅在val中有空格才有必要写引号
declare -i sum= 0
 
for  in  $(seq  0  ${#file_name[@]});  do
         let i-= 1
     if  [ $[$i% 2 ] -eq  0  ]; then
         sum=$[sum+$(wc -l < ${file_name[$i]})]
     fi
done
 
echo $sum
1
2
3
4
5
6
7
8
9
10
11
练习:生成 10 个随机数,对其排序
#!/bin/bash
#
declare -a rand
declare -i i= 0
while  [ $i -le  9  ];  do
     rand[$i]=$RANDOM
     let i++
done
 
echo  "${rand[@]}"  | xargs -n  1  | sort -n -r | xargs


字符切片

wKioL1m4x8_QZFC-AAAykzgA-OU765.png


基于模式取子串

自左向右 #*STRING ##*STRING

wKiom1m4yGDQOYI0AAAItJ2J33I333.png

wKiom1m4yQ_R6cpSAAAK_sgg-d0294.png

自右向左 %STRING* %%STRING*

wKioL1m4yOaTYriLAAALQJV7H6A515.png

wKioL1m4yLCDVPYhAAAIw5cRuzs618.png


查找替换<[行首、尾]字符>

替换为字符,自左向右

wKiom1m4yxWRepCCAABAR2yYi_Q163.png

替换为空

wKiom1m4yzjRR-SbAAAG545z9jg858.png


使用示例

wKiom1m4zMWRAZEiAABZ8xr3ANA360.png



字符大小写转换 相当于 tr 'a-z' 'A-Z'

wKioL1m4zLii-OkrAAANM5mFJOc703.png


使用示例

wKioL1m4zS6jlfgrAAAOCVz637I327.png


变量默认值 

不存在,赋值

wKiom1m4zsjBtggNAAAtc-V3JMQ795.png

wKioL1m4zp-R4IVCAAAplI9fupQ453.png

存在时,赋值

wKioL1m4zvmD51p2AAAk60EyLIk592.png

不存在报错,存在返回var

wKiom1m4z5-i_nYBAAAN_ioENH0579.png


为脚本提供配置

wKioL1m40HGDF47tAAAXFjkmjLw201.png


使用示例:为设定主机名

wKioL1m40TPB96AMAAAR3Tk9gds160.png

wKiom1m40YXzaj_6AAAc6baEPOw562.png


mkstemp命令

wKioL1m40iPidPO9AABHRl7jVzo074.png


install命令

wKioL1m40weiCYzSAAA7DJkG3cs033.png


练习: 写一个脚本

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

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

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

/bin/bash --> /mnt/sysroot/bin/bash

/usr/bin/passwd --> /mnt/sysroot/bin/passwd


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

/lib/ld-linux-x86_64.so.2 --> /mnt/sysroot/lib/ld-linux-x86_64.so.2


进一步地:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash
# Version:  0.0 . 15
# Author: Lcc.org
# Description: ...
 
DIR= "/mnt/sysroot"
[ -d $DIR ] || install -d $DIR
 
function  cpCmd {
     cmd_path=$(which --skip-alias $ 1 )
     local cmdir=$(echo $cmd_path | sed  's,/$,,'  | sed -r  's@(.*/)([^/]+)@\1@' )
     [ -d $DIR$cmdir ] || install -d $DIR$cmdir
     [ -f $DIR$cmd_path ] && echo -e  "\033[32m$DIR$cmd_path\033[0m is exist"  || cp $cmd_path  $DIR$cmd_path 
}
 
function  cp_lib {
     for  in  $(ldd $cmd_path | grep -o --color=auto  "/.*[[:space:]]"  | tr -d  ' ' );  do
         local libdir=$(echo $i | sed  's,/$,,'  | sed -r  's@(.*/)([^/]+)@\1@' )
         [ -d $DIR$libdir ] || install -d $DIR$libdir
         [ -f $DIR$i ] && echo -e  "\033[32m$DIR$i\033[0m is exist"  || cp $i $DIR$i
     done
}
 
read -t  10  -p  'Enter a binary program name: '  fuke
 
while  "$fuke"  !=  "quit"  ];  do
     if  "$fuke"  ==  "quit"  -o -z  "$fuke"  ]; then
         continue
     elif ! which $fuke &> /dev/ null ; then
         continue
     fi
##复制命令
     cpCmd $fuke
##复制库文件
     cp_lib
##显示复制完成
     echo -e  "\033[32mcopy finished.....\033[0m"
     read -t  10  -p  'Enter again a binary program name: '  fuke
done









本文转自 lccnx 51CTO博客,原文链接:http://blog.51cto.com/sonlich/1964938,如需转载请自行联系原作者
目录
相关文章
|
30天前
|
算法 Linux C++
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
29 0
|
30天前
|
算法 Linux C++
【Linux系统编程】深入解析Linux中read函数的错误场景
【Linux系统编程】深入解析Linux中read函数的错误场景
205 0
|
30天前
|
Linux API C语言
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
34 0
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
|
1月前
|
Linux 数据处理 C++
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(一)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
77 0
|
1月前
|
存储 Linux 测试技术
无效数据处理之道:Linux系统编程C/C++实践探索(三)
无效数据处理之道:Linux系统编程C/C++实践探索
17 0
|
1月前
|
存储 Linux API
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(三)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
31 1
|
1月前
|
消息中间件 Linux 数据处理
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(二)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
32 1
|
30天前
|
存储 算法 Linux
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
39 0
|
30天前
|
存储 算法 Linux
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
45 0
|
2天前
|
Java Shell Linux
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?