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

数组

数组名

数组定义

数组引用

数组元素的赋值方式

销毁数组

unset ARRAY_NAME[INDEX]

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

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

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

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

示例一:生成10个随机数保存于数组中,取出最大值和最小值
#!/bin/bash
#

declare -a rand
declare -i max=
declare -i min=
for i 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"
示例一:生成10个随机数保存于数组中,求下标为偶数的所有随机数之和
#!/bin/bash
#

declare -a rand
declare -i sum=0
for i 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"
练习:写一个脚本
定义一个数组,数组中的元素是/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 i 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
练习:生成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

字符切片

基于模式取子串

自左向右 #*STRING ##*STRING

自右向左 %STRING* %%STRING*


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

替换为字符,自左向右

替换为空

使用示例

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

使用示例

变量默认值

不存在,赋值

存在时,赋值

不存在报错,存在返回var

为脚本提供配置

使用示例:为设定主机名

mkstemp命令

install命令

练习: 写一个脚本

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即退出

#!/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 ‘[email protected](.*/)([^/]+)@\[email protected]‘)
	[ -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 i in $(ldd $cmd_path | grep -o --color=auto "/.*[[:space:]]" | tr -d ‘ ‘); do
		local libdir=$(echo $i | sed ‘s,/$,,‘ | sed -r ‘[email protected](.*/)([^/]+)@\[email protected]‘)
		[ -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


时间: 2024-10-09 04:13:39

谢烟客---------Linux之bash编程的相关文章

谢烟客---------Linux之Bash基础特性条件测试&&自定义退出状态码(6)

条件测试 判断某需求是否满足,需要由测试机制来实现. 根据命令的执行状态结果,表达不同的测试条件 1.根据id命令的执行状态结果,判断用户是否存在 [[email protected] ~]# id root uid=0(root) gid=0(root) groups=0(root) [[email protected] ~]# echo $? 0 [[email protected] ~]# id help id: help: no such user [[email protected] 

linux下Bash编程组合测试及编写脚本(五)

linux下Bash编程组合测试及编写综合脚本(五) 1.Bash编程组合测试条件 -a: 与关系 -o: 或关系 !: 非关系 表示方法1:[ $# -gt 100 -a $# -le 500 ] 表示方法2:[ $# -gt 100 ] && [ $# -le 500 ] 2.编写一个任意添加与删除用户的脚本,要求如下: 2.1:如果脚本选项是--add:,将添加用户; 如果选项是--del,将删除用户,如果是--help显示帮助信息 2.2:脚本选项后面的参数可任意指定多个用户并且用

linux下Bash编程循环语句特殊用法之编写脚本(十)

linux下Bash编程while语句特殊用法之编写脚本(十) 1.循环控制: break:中断整个循环语句,即退出循环后执行脚本后面的语句 continue:中断当前本次循环,提前进入下一轮循环 exit:结束脚本运行 2.while死循环,即当不知道循环多少次时 格式 : while :; do 循环语句 done 3.while从输入重定向文件中每行读取并赋值给read变量 格式:  while read LINE;do 循环语句 done < 路径文件 4.实例脚本 4.1.找出/etc

谢烟客---------Linux之Bash基础特性(2)

Linux之哲学思想 一切皆文件 避免交互,实现Bash编程 文本编程命令实现配置 组合小程序完成复杂任务 总结 过程式编程 解释执行 字符和数值存储的区别 shebang -> cpu ->解释器 数据类型 变量类型,即为内部数据的类型 bash 过程式编程.解释执行 变量的类型为:弱类型 11)Bash编程 编程风格:过程式编程.对象式编程 过程式编程:目的解决问题 只考虑数据怎么组织 指令组织数据 为了完成复杂的任务 顺序执行:逐个运行任务 选择执行:有一个标准,只执行某些代码片段 循环

谢烟客---------Linux之bash脚本编程---if补充和for循环

bash:过程式编程,为了完成更复杂的任务,支持顺序执行.选择执行.循环执行 顺序执行:从左而右,依次执行命令. 选择执行:依据condition(条件)的执行状态结果,选择执行不同的代码片段. 循环执行:依据condition(条件)的执行状态结果,决定是否进入循环. condition: ture: 表示条件状态结果为0 false: 表示条件执行状态结果非0 if 单分支.双分支.多分支.嵌套if语句 1.单分支结构 if condition; then     if-ture fi 2.

谢烟客---------Linux之bash脚本编程---选择执行

编程风格 过程式编程,目的解决问题 指令组织数据,指令的堆砌 为了完成复杂的任务 顺序执行:遍历的方式执行,逐个运行 选择执行:有一种选择标准,结果只能有一种选择,只执行某些 代码片段 循环执行:对一类对象逐个运行相同的运算,类似于 拉磨 的方式,某些代码连续执行多次 对象式编程: 数据为中心 程序执行的方式 编译:先翻译后执行,先将高级语言转换为目标代码:C,java程序 --> 编译 --> 目标代码 解释:边翻译边执行,为避免语法.逻辑等错误,一般先进行语法检查 Shell,java,p

谢烟客---------Linux之bash脚本编程---用户交互

系统管理部分一: 分区.创建.查看.调整.挂载.文件系统的结构.硬链接.软链接 脚本"语法错误"非逻辑错误检测: # bash -n script.sh 单独执行,脚本执行每个代码 # bash -x script.sh +        程序在执行 没有+    程序过程中应该输出的信息 脚本的格式 +++++++++++++++++++++++++++++++++非格式,用于分割++++++++++++++++++++++++++++++++++ #!/bin/bash     #

谢烟客---------Linux之Bash基础特性算术运算(5)

算术运算 算术:数学中最古老,最基础和最初等的部分.它研究数的性质及其运算.把数和数的性质,数和数之间的四则运算在应用过程中的经验积累起来,并加以整理,就形成了最古老的一门数学--算术 算术运算:数的加.减.乘.除以及乘方开方等数学运算,区别于几何运算. 算术运算的符号 完成基本的算术运算 (arithmetic operators) 符号,就是用来处理四则运算的符号 1)加法:同类事物的重复或累计,是数字运算的开始,不同类比如一个苹果+一个橘子其结果只能等于二个水果就存在分类与归类的关系 公式

谢烟客---------Linux之Bash基础特性变量(3)

变量 程序 = 指令(只读) + 数据(数据存储的位置变量.列表.数组) 指令可通过位置变量调用,向脚本传递的数据 变量名 可引用的"命名的内存空间":取了名字的内存空间,用名字即可调用事先划分的内存空间 变量类型 变量内部存储的数据的类型 变量类型的作用 限定了存储空间 限定了存储格式 限定了参与的运算 变量的类型 字符型 数值型 整型 浮点型 变量的类型 强类型 定义变量时,必须指定变量的类型,参与的运算必须符合要求 调用未申明的变量,会报错 弱类型 定义变量时,不用指定变量的类型