一、环境
系统:Centos6.6 x64
shell:bash、sh

[centos@Shell ~]$ hostnameShell[centos@Shell ~]$ lsb_release -aLSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarchDistributor ID: CentOSDescription: CentOS release 6.6 (Final)Release: 6.6Codename: Final[centos@Shell ~]$ echo $SHELL/bin/bash[centos@Shell ~]$ ifconfig eth0 |grep "t addr"| awk -F '[: ]+' '{print $4}'192.168.101.110

二、脚本示例
1、终端打印

#!/bin/bash#The printf of Linux termnal,Include "echo,printf"#author by woon echo "The shell\`s name is $0"#examples of echo,printf#默认打印。输出换行echo "Hello World!" echo 'Hello World!'#echo -n参数接受不换行输出echo -n "Hello World"echo "Hello World"#-e参数接受双引号内字符串的转移列表echo "Hello\tWorld!"echo -e "Hello\tWorld!"#printf使用文本或由空格分割的参数,可指定输出的宽度、对其方式等,可以格式化输出,默认情况下,printf不输出换行printf "%-5s %-10s %-4s\n" No. NAME Markprintf "%-5s %-10s %-4s\n" 1 Lee 80printf "%-5s %-10s %-4.2f\n" 2 Woon 90.456printf "%-5s %-10s %-4.2f\n" 3 James 85.654321printf "%-5s %-10s %-5.3f\n" 4 Jeff 85.123789

运行结果:

The shell`s name is shell_print.shHello World!Hello World!Hello WorldHello WorldHello World!-e Hello World!No. NAME Mark1 Lee 80 2 Woon 90.463 James 85.654 Jeff 85.124

2、环境变量

#!/bin/bash#author by woon#env#获取全局环境变量env > /tmp/env_$(date +%Y%m%d).$$head -n 10 /tmp/env_$(date +%Y%m%d).$$echo "^^^^^^^^^^^^^^^^^分隔符^^^^^^^^^^^^^^^^^^^^^^" #获取单个全局变量的值echo $PATHecho "^^^^^^^^^^^^^^^^^分隔符^^^^^^^^^^^^^^^^^^^^^^"#自定义变量和自定义全局变量,删除环境变量var="Hello World"echo -n "$var" echo -n $varecho ${var}#设置全局环境变量export VAR#获取当前的shell版本echo $SHELL#orecho $0#获取变量的长度var="Hello World"echo ${#var}#变量内容的删除path=$PATHecho $pathecho "最短删除,非贪婪模式,由前向后删除"var1=${path#/*:}echo $var1echo "贪婪模式,删除匹配到最长的,由前向后删除"var2=${path##/*:}echo $var2echo "非贪婪模式%,由后向前删除"var3=${path%:*bin}echo $var3echo "贪婪模式,由后向前删除最长的"var4=${path%%:*bin}echo $var4

3、shell数学运算

#!/bin/bash#author by woon.#数学运算sum_jia=0sum_cheng=1i=1while [ $i -le 10 ]; do let "sum_jia+=i" let "sum_cheng*=i" let "i += 2"donesum_jian1=$[ sum_cheng - sum_jia]sum_jian2=$(( sum_cheng - sum_jia ))echo $sum_jiaecho $sum_chengecho $sum_jian1echo $sum_jian2

运行结果
$ ./shell_num.sh
25
945
920
920

4、文件查找和文件列表几操作

#!/bin/bash#author by woon#find 可以基于名字、类型、时间、大小、目录深度、大小权限、用户等查找并执行动作#examplesudo find /etc/ -iregex ".*\(\.py\|\.sh\)" -type f -atime -1 -user root -size -2k -perm 644 -print#sudo find /etc/ -iregex ".*\(\.py\|\.sh\)" -type f -atime -1 -user root -size -2k -perm 644 -deletesudo find /etc/ -iregex ".*\(\.py\|\.sh\)" -type f -atime -1 -user root -size -2k -perm 644 -exec ll {} \;sudo find /etc/ -iregex ".*\(\.py\|\.sh\)" -type f -atime -1 -user root -size -2k -perm 644 -print0 | xargs -0 ls -l

5、tr转换
tr参数属于集合映射关系
tr删除

[centos@Shell scripts]$ uuidgen | tr -d [a-z]37643-2050-48-25-547825

tr替换
本替换其实值将0-a、1-b …… 9-j的映射关系替换

[centos@Shell scripts]$ echo | md5sum |tr [0-9] [a-z]gibdcjdajijdedeajjchdiadfcbjcjea -

6、校验和核实
md5sum

[centos@Shell scripts]$ lsdialog_t.md5 os_monitor-dialog.sh shell_print.sh test.shdialog_t.sh pcpu_usage.sh shell_search.sh top10_commands.shinpath shell_num.sh shell_varable.sh[centos@Shell scripts]$ md5sum os_monitor-dialog.sh >os_monitor-dialog.md5[centos@Shell scripts]$ md5sum -c os_monitor-dialog.md5 os_monitor-dialog.sh: 确定

脚本示例

#!/bin/bash#为/etc/passwd生成一个MD5并校验,在生成MD5前检查/etc/passwd文件是否已经被排过序sort -C /etc/passwdif [ $? -eq 0 ]; then echo "Sorted"else echo "Unsorted!" md5sum /etc/passwd > passwd.md5fimd5sum -c passwd.md5

7、生成随机数
$RANDOM生成一个随机数;date +%s%N获取随机数字字符串
脚本如下:

#!/bin/bash#创建example目录,在该目录下批量生成10个日志文件,日志文件名包含10个随机小写字母和固定字符串example;当前用户不具有权限,需要设置权限if [ ! -d /example ]; then echo "centos"|sudo -S mkdir /example echo "centos" | sudo -S chown centos:centos /example -Rfi#产生随机数$RANDOM,或uuidgen命令或者用MD5sum,然后替换for num in $(seq 1 10)do touch /example/$(echo $RANDOM | md5sum |tr "0-9" "a-z"|cut -c 1-10)_example.logdone

8、根据扩展名切分文件名

#!/bin/bash#shell name:shell_split.sh#切分文件名并批量重命名或移动,比如图形文件等num=1;for img in *.jpg *.imgdo mv $img image-$num.{img##*.} 2>/dev/null if [ $? -eq 0 ]; then echo "Rename $img to image-$num.${img##*.}" let num++ fidone

9、列举文件类型统计信息
给出一个路径,统计该路径下各文件类型的数量

#!/bin/bash#shell name:shell_filestat.sh#列举文件类型数量if [ $# -ne 1 ]; then echo -e "$0 path\nexample:$0 /etc/"else path=$1 declare -A array;while read line;do#echo $(file -b $line) ftype=$(file -b $line) let array["$ftype"]++;done< <(find $path -type f -print)fiecho ========== File types and counts ===========for ftype in "${!array[@]}"do echo $ftype : ${array["$ftype"]}done

10、判断当前系统是否支持该命令

#!/bin/shin_path(){ cmd=$1 path=$2 retval=1 oldIFS=$IFS IFS=":" for directory in $path do if [ -x $directory/$cmd ] ; then retval=0 fi done IFS=$oldIFS return $retval}checkForCmdInPath(){ var=$1 if [ "$var" != "" ] ; then if [ "${var%${var#?}}" = "/" ] ; then if [ ! -x $var ] ; then return 1 fi elif ! in_path $var $PATH ; then return 2 fi fi}if [ $# -ne 1 ] ; then echo "Usage: $0 command" >&2 ; exit 1ficheckForCmdInPath "$1"case $? in 0 ) echo "$1 found in PATH" ;; 1 ) echo "$1 not found or not executable" ;; 2 ) echo "$1 not found in PATH" ;;esacexit 0