1. 程式人生 > >謝煙客---------Linux之bash編程

謝煙客---------Linux之bash編程

博客 linux 運維 遊戲 it 互聯網

數組

技術分享


數組名

技術分享


數組定義

技術分享


數組引用

技術分享

技術分享


技術分享

技術分享


技術分享

技術分享


技術分享


技術分享

技術分享


數組元素的賦值方式

技術分享

技術分享

技術分享

技術分享

技術分享


銷毀數組

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




本文出自 “Reading” 博客,請務必保留此出處http://sonlich.blog.51cto.com/12825953/1964938

謝煙客---------Linux之bash編程