bash 脚本进阶

1 流程控制

过程式编程语言
  顺序执行
  选择执行
  循环执行
顺序执行
  按照脚本的由上到下,一步步执行,直到结束
选择执行
  通过条件判断,执行相应的代码,如if,case
循环执行
  通过一定的条件,循环执行某些命令,如for ,while,until
1.编写脚本/root/bin/createuser.sh ,实现如下功能:使
用一个用户名做为参数,如果指定参数的用户存在,就显示
其存在,否则添加之;显示添加的用户的id 号等信息
#!/bin/bash
read -p "please input a username: " user
if id $user;then
    echo "user is exists"
    exit 
else
    useradd $user &>/dev/null
    password=`openssl rand -hex 4`
# 将生成的密码记录下来
    echo $user:$password >>./password.log 
    echo $password | passwd --stdin $user &>/dev/null
fi
2.写脚本/root/bin/yesorno.sh ,提示用户输入yes 或no,
并判断用户输入的是yes 还是no, 或是其它信息
#!/bin/bash
read  -p "input answer: " answer
answer=`echo $answer| tr '[:upper:]' '[:lower:]'`
case $answer in
t|true|y|yes)
    echo yes
    ;;
f|false|n|no)
    echo no
    ;;
*)
    echo invalid
esac
3.写脚本/root/bin/filetype.sh, 判断用户输入文件路径
,显示其文件类型(普通,目录,链接,其它文件类型)
#!/bin/bash
read -p "please input a path: " path
[ ! -e $path ] && echo "file is not exists" && exit 1
[ -h $path ] && echo "it is link" && exit
[ -f $path ] && echo "it is common file " &&exit
[ -d $apth ] && echo "it is directory" && exit
4.编写脚本/root/bin/checkint.sh, 判断用户输入的参数是
否为正整数
#!/bin/bash
read -p "input a num: " num
[ $num -gt 0 -o `expr 0 + $num` ] && echo it's a +num
for
1.判断/var/ 目录下所有文件的类型
#!/bin/bash
for file in /var/*;do
    /usr/bin/file $file
done
2 .添加10 个用户user1-user10 ,密码为8 位随机字符
#!/bin/bash
for user in user{1..10};do
    if id $user &>/dev/null;then
    echo "$user is exits"
    else
    useradd $user
    password=`openssl rand -hex 4`
    echo $user:$password
    echo "$password" | passwd --stdin $user &>/dev/null
    fi
done
3./etc/rc.d/rc3.d 目录下分别有多个以K 开头和以S 开头的文件;分别读取每个文件,以K 开头的输出为文件加stop ,以S 开头的输出为文件名加start ,如K34filename stop S66filename start
#!/bin/bash
for file in /etc/rc.d/rc3.d/*;do
    file=$(basename $file)
    if [[ $file =~ ^K ]];then
    echo "$file stop"
    elif [[ $file =~ ^S ]];then
    echo "$file start"
    else 
    echo "nothing to do"
    fi
done
4.编写脚本,提示输入正整数n 的值,计算1+2+…+n 的总和
#!/bin/bash
read -p "input a num: " num
#let sum=($num+1)*$num/2
a=`expr $num + 1`
b=`expr $a \* $num`
sum=`expr $b \/ 2`
echo $sum
5.计算100 以内所有能被3 整除的整数之和
#!/bin/bash
read -p "input a num: " num
#echo `seq 0 3 $num` | tr " " "+" | bc
#echo {0..100..3} | tr " " "+" | bc
declare -i sum=0
for i in `seq 0 3 $num`;do
    if [ `expr $i % 3` -eq 0 ];then
    let sum+=$i
    fi
done
echo $sum
6 .打印九九乘法表
#!/bin/bash
declare -i I=1
declare -i sum=0
while [ $I -le 9 ];do
    declare -i J=1
    while [ $j -le $i ];do
        let sum=$j*$i
#       if [ $I -le 4 -a $J -eq 3 ];then
#           echo -n " "
#       fi
#       if [ $I -ne $J ];then
            echo -ne "$J*$I=$sum\t"
#       else
#           echo  "$J*$I=$sum"
#       fi
        let J++
    done
    echo 
    let I++
done
7 .在/testdir 目录下创建10 个html 文件, 文件名格式为数字N (从1 到10 )加随机8 个字母,如:1AbCdeFgH.html
#!/bin/bash
for i in {1..10};do
    random=`tr -dc '[:alnum:]' < /dev/urandom|head -c 8`
    touch ${i}${random}.html
done
1 每隔3 秒钟到系统上获取已经登录的用户的信息;如果发
现用户hacker 登录,则将登录时间和主机记录于日志
/var/log/login.log 中, 并退出脚本
#!/bin/bash
a=` w | awk -F" " '$1=="hacker"{print $1,$3}'`
while : do
[ `wc -l ` -ge 1 ]&& echo $a >>/var/log/login.log
sleep 3
done       

2 函数

函数变量
  环境变量:当前shell 和子shell 有效
  本地变量:只在当前shell 进程有效,为执行脚本会启动专用子shell 进程;因此,本地变量的作用范围是当前shell 脚本程序文件,包括脚本中的函数
  局部变量:函数的生命周期;函数结束时变量被自动销毁
  注意:如果函数中有局部变量,如果其名称同本地变量,使
用局部变量
函数有两种返回值:
  函数的执行结果返回值:
    (1)  使用echo 等命令 进行输出
    (2)  函数体中调用命令的输出结果
  函数的退出状态码:
    (1)  默认取决于函数中执行的最后一条命令的退出状态码
    (2)  自定义退出状态码, 其格式为:
      return 从函数中返回,用最后状态命令决定返回值
      return 0 无错误返回。
      return 1-255 有错误 返回
编写函数,实现OS 的版本判断
#!/bin/bash
get_ver (){
    return `sed -r "s@.* ([0-9])\..*@\1@" /etc/redhat-release`
}
get_ver
echo $?
编写函数,实现取出当前系统eth0 的IP 地址
#!/bin/bash
get_ip (){
   a=`ip addr show eth0 | sed -rn  "s@.*inet (.*)/.*@\1@p"`
   export a
}
get_ip
echo $a
编写函数,实现打印绿色OK 和红色FAILED
echo_ok(){
   echo -en "$1\\033[60G[";echo -en "\\033[1;32m";echo -en "   ok   ";echo -en "\\033[0;39m]\n"
}
echo_fail(){
    echo -en "$1\\033[60G[";echo -en "\\033[1;31m";echo -en " failed ";echo -en "\\033[0;39m]\n"
}
[ 1 -eq 0 ] || echo_fail "1=0" 
[ 1 -eq 1 ] && echo_ok "1=1"
  编写脚本/root/bin/copycmd.sh
(1)  提示用户输入一个可执行命令名称
(2)  获取此命令所依赖到的所有库文件列表
(3)  复制命令至某目标目录( 例如/mnt/sysroot) 下的对应路径下;   如:/bin/bash ==> /mnt/sysroot/bin/bash
/usr/bin/passwd ==> /mnt/sysroot/usr/bin/passwd
(4)  复制此命令依赖到的所有库文件至目标目录下的对应路径下 如:/lib64/ld-linux-x86-64.so.2 ==>/mnt/sysroot/lib64/ld-linux-x86-64.so.2
(5) 每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成上述功能;直到用户输入quit 退出

target=/app
read -p "please input a cmd(eg:ls): " cmd
until [ "$cmd" == "quit" ];do
    pcmd=`which --skip-alias $cmd`
    [ -e $target$pcmd ] && { echo $cmd is exists;read -p "please input a cmd(eg:ls): " cmd;continue; }
    cmdpath=`dirname $pcmd`
    [ -d $target$cmdpath ] || mkdir -p $target$cmdpath
    [ -e $target$pcmd ] || cp $pcmd $target$cmdpath
    #for i in `ldd $pcmd |egrep -o "/.*[[:space:]]+"`;do
    for i in `ldd $pcmd | sed -rn "s@[^/]*(/.*)[[:space:]].*@\1@p"`;do
    #for i in `ldd $pcmd | egrep -o "/.*\.[^[:space:]]+"`;do
    libdir=`dirname $i`
    [ -d $target$libdir ] || mkdir -p $target$libdir
    [ -e $target$i ] || cp $i $target$libdir
    done
    read -p "please input a cmd(eg:ls): " cmd
done
斐波那契数列又称黄金分割数列,因数学家列昂纳多· 斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的
是这样一个数列:0 、1 、1 、2 、3 、5 、8 、13 、21 、34、 、…… ,斐波纳契数列以如下被以递归的方法定义:F (0 )=0, F (1 )=1 ,F (n )=F(n-1)+F(n-2) (n≥2) )利用函数,求n阶菲波那切数列
#!/bin/bash
fab(){
    if [ $1 -eq 0 ];then
    echo 0
    elif [ $1 -eq 1 ];then
    echo 1
    else
    echo $[`fab $[$1-1]`+`fab $[$1-2]`]
    fi
}
read -p "onput a num > 0 (eg:10): " num
fab $[$num-1] 

3 数组

引用数组元素:
  ${ARRAY_NAME[INDEX]}
  注意:省略[INDEX] 表示引用下标为0 的元素
引用数组所有元素:
  ${ARRAY_NAME[*]}
  ${ARRAY_NAME[@]}
数组的长度( 数组中元素的个数): :
  ${#ARRAY_NAME[*]}
  ${#ARRAY_NAME[@]}
删除数组中的某元素:导致稀疏格式
  unset ARRAY[INDEX]
删除整个数组 :
  unset ARRAY
数组切片:${ARRAY[@]:offset:number}
    offset:  要跳过的元素个数
    number:  要取出的元素个数
取偏移量之后的所有元素
    ${ARRAY[@]:offset}
向数组中追加元素:
  ARRAY[${#ARRAY[*]}]=value
1.输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
#!/bin/bash
declare -i tmp
declare -a c
c=(`for i in $(seq 1 10);do echo $RANDOM ;done`)
echo ${c[*]}

for I in $(seq 1 ${#c[*]});do
    for J in $(seq $I $[${#c[*]}-1]) ;do
        if [ ${c[$[$I-1]]} -gt ${c[$J]} ];then
#           echo ${c[$[$I-1]]} $[$I-1]  ${c[$J]} $J
            tmp=${c[$[$I-1]]}
            c[$[$I-1]]=${c[$J]}
            c[$[$J]]=$tmp
        fi
    done
done
echo ${c[*]}
unset tmp
unset c
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • 第1章 认识JS JavaScript能做什么?1.增强页面动态效果(如:下拉菜单、图片轮播、信息滚动等)2.实现...
    mo默22阅读 1,270评论 0 5
  • 第1章 系好安全带,准备启航 1.1让你认识JS 1.1.1 JavaScript能做什么?增强页面动态效果(...
    张中华阅读 1,368评论 4 10
  • 假期,对现在的我们意味着什么?是休息,是放松,是去痛痛快快地来一次说走就走的旅行……一周的假,不论是朋友圈还是...
    拂面浮面阅读 274评论 0 1
  • 20170420金明华连接真我和天使指导灵分享奇迹: 1.今天去了百货公司买了2条漂亮的裙子和3件衣服,还有3套睡...
    沐浴阳光573阅读 217评论 0 0
  • - 方法1:performSelector// 1.5s后自动调用self的hideHUD方法[self perf...
    Hevin_Chen阅读 119评论 0 0