謝煙客---------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
本文出自 “Reading” 博客,請務必保留此出處http://sonlich.blog.51cto.com/12825953/1964938
謝煙客---------Linux之bash編程