55个shell脚本编程的例子-3

接第二部分,此为第三部分:第32-55个shell例子。

 

Eg32、while/until/for经典例子

#!/bin/bash

## filename: while-infinite_loops.sh

while true; do

    sleep 5

    echo "infinite loops [ hit CTRL+C to stop]"

done

 

Eg33、while/until/for经典例子

#!/bin/bash

## filename: until-infinite_loops.sh

until false; do

    sleep 5

    echo "infinite loops [ hit CTRL+C to stop]"

done

 

Eg34、while/until/for经典例子

#!/bin/bash

## filename: for-infinite_loops.sh

for (( ; ; )); do

    sleep 5

    echo "infinite loops [ hit CTRL+C to stop]"

done

具体执行都是一样的:

2e64ee82f8744ccdb6a77857174f2023.png

 

Eg35、将循环接管通过管道传递给其他命令(done |)

#!/bin/bash

## filename: loop--to_pipe.sh

 

for i in 7 8 9 2 3 4 5 11; do

        echo $i

done | sort -n

 

 

awk -F':' '$3 >= 500 {print $1}' /etc/passwd |

while IFS= read -r person

do

    echo $person

done | sort

26b1f38bb9914d40a1afc99fd4eccc5e.png

##该 awk 命令从 /etc/passwd 文件中筛选出 UID 大于等于 500 的行,并仅输出这些行的用户名。

awk 是一个强大的文本分析工具,用于逐行处理输入文件。

-F: 指定了字段分隔符为冒号(:),这是 /etc/passwd 文件中各字段间的分隔符。

'$3 >= 500 {print $1}' 是 awk 的脚本部分:

  • $3 >= 500 是条件表达式,检查每一行的第三个字段(即UID)是否大于等于 500。
  • {print $1} 是满足条件时执行的动作,打印当前行的第一个字段(即用户名)。

 

Eg36、后台执行循环(done &)

#!/bin/bash

## filename: loop--in_background.sh

nobody=xh_ry@163.com

linux=38742777@qq.com

 

for person in $linux $nobody

do

     #mail -s "Test" $person < "Hello  everyone"

     echo "hi,ih" | mail -s "test loop-in-backgroud" $person

done &

 

 

awk -F':' '$3 >= 500 {print $1}' /etc/passwd |

while IFS= read -r person

do

    mail -s "2nd mail test" $person <<-END

        Hello $person,

            This message is from $(hostname -f).

                         $USER   $(date +%F)

        END

done &

执行后会发送邮件给nobody和linux,注意第二段的脚本需要执行mail -s交互性操作。可以分离输入。

Eg37、while实现循环菜单

#!/bin/bash

## filename: what-lang-do-you-like_while.sh

while :

do

  echo "====== Scripting Language ======"

  echo "1) bash"

  echo "2) perl"

  echo "3) python"

  echo "4) ruby"

  echo "5) (Quit) "

  read -p "What is your preferred scripting language?  " lang

  case $lang in

    1|bash)     echo "You selected bash"  ;;

    2|perl)     echo "You selected perl"  ;;

    3|python)   echo "You selected python";;

    4|ruby)     echo "You selected ruby"  ;;

    5|quit)     break ;;

  esac

done

9c301eeafa1c4f37b449815009c52def.png

 

Eg38、select实现循环菜单1。

#!/bin/bash

## filename: what-lang-do-you-like_select.sh

clear

PS3="What is your preferred scripting language?  "

 

select s in bash perl python ruby quit

do

  case $s in

    bash|perl|python|ruby) echo "You selected $s"  ;;

    quit) break  ;;

       *) echo "You selected error , retry …" ;;

  esac

done

77f7ea36610a424dadf96beea1396165.png

 

Eg39、select实现循环菜单2。

#!/bin/bash

## filename: what-os-do-you-like_select.sh

clear

PS3="What is your preferred OS? "

IFS='|'

os="Linux|Gnu Hurd|FreeBSD|Mac OS X"

select s in $os

do

  case $REPLY in

    1|2|3|4) echo "You selected $s"  ;;

          *) break ;;

  esac

done

3014d0b2599b476187a2b46fe4c9dde2.png

 

Eg40、select实现循环菜单3。

#!/bin/bash

## filename: /root/bin/xtop

## filename: what-cmd-do-you-want_select.sh

 

PS3="Select a program you want to execute: "

 

TOPLIST="top htop atop nettop jnettop iftop ftop iotop mytop innotop dnstop apachetop"

 

clear

select prog in $TOPLIST quit

do

    [[ $prog == quit ]] && exit

    apt list --installed $prgo 2>&1 > /dev/null

    #dpkg -s $prog > /dev/null

    #rpm -q $prog > /dev/null &&

        $prog || echo " $prog is not installed."

done

rpm是redhat/rhel下的,dpkg是debian下的检测包安装命令

执行如下:

0d0490247ac442ff83f4e9fadf5638c4.png

选择1后,

37d7e8bf2982475fbe20ed99577f8d49.png

q退出后继续选择3,6,9,13结束。

a9043001961245d99430718ee05249d3.png

 

Eg41、for遍历-参数个数-实例

#!/bin/bash

## filename: pp_traverse_1.sh

# Usage: pp_traverse_1.sh [arguments]

#

 

echo "The name of this script is: `basename $0`"

echo "The arguments are: $*"

echo "The number of arguments is: $#"

 

for i ; do  echo "$i" ; done

 

num=1

for i ; do

  echo "The ${num}th argument is: $i"

  ((num++))

done

 

dedda7a5c51046e59075c429437bf28d.png

 

Eg42、while实现-参数遍历实例

#!/bin/bash

## filename: pp_traverse_2.sh

# This script is to test command line arguments

# Usage: pp_traverse_2.sh [arguments]

#

echo "----- using the first kind of method ---- "

num=1

while [ $num -le $# ]

do

  # eval para=\$$num

  # echo "The ${num}th argument is: $para"

  echo "The ${num}th argument is: ${!num}"

  let num=num+1

done

echo "----- using the second kind of method --- "

for (( num=1 ; num <= $# ; num++)) ; do

  echo "The ${num}th argument is: ${!num}"

done

 

35d3bf68f2c54bd6bd7c0a121fb05c04.png

 

Eg43、使用_shift_while遍历的实例

#!/bin/bash

## filename: pp_traverse_shift_while.sh

# Usage: pp_traverse_shift_while.sh [arguments]

#

echo "using while loop to traverse positional parameter"

 

#while [[ "$1" ]] ; do

#    echo "$1"

#    shift

#done

 

num=1

while [[ "$1" ]] ; do

    echo "The ${num}th argument is: $1"

    let num=num+1

    shift

done

d50eeb82573b4ea69b9a8fe490d3e5eb.png

 

Eg44、使用_shift_until遍历的实例

#!/bin/bash

## filename: pp_traverse_shift_until.sh

# Usage: pp_traverse_shift_until.sh [arguments]

#

echo "using until loop to traverse positional parameter"

 

#until [ -z "$1" ] ; do

#    echo "$1"

#    shift

#done

 

num=1

until [ -z "$1" ]

do

    echo "The ${num}th argument is: $1"

    ((num++))

    shift

done

 

d3c0989bc6ca47ab84ecd7b17a0cc94f.png

 

Eg45、使用_shift_for遍历的实例

#!/bin/bash

## filename: pp_traverse_shift_for.sh

# Usage: pp_traverse_shift_for.sh [arguments]

#

echo "using for loop to traverse positional parameter"

 

#for (( ; ; )) ; do

#    [ -n "$1" ] &&  echo "$1" || break

#    shift

#done

 

for (( num=1 ; ; num++ )) ; do

    [ -n "$1" ] &&

      echo "The ${num}th argument is: $1" || break

    shift

done

0019a6bc914a46bd8af6d11f36418482.png

 

Eg46、shift位置参数变量实例-实现HTM重命名为html。

#!/bin/bash

## filename: ren

if [ $# -lt 3 ] ; then

cat <<_HELP_

FUNCTION:  Renames a number of files using sed regular expressions.

USAGE:     $0 '<regexp>' '<replacement>' <files ...>

EXAMPLE:   Rename all *.HTM files to *.html:

           $0 'HTM$' 'html' *.HTM

_HELP_

exit 1

fi

OLD="$1" ; NEW="$2" ; shift ; shift  # $* contains now all the files

for file in $*; do

    if [ -f "$file" ] ; then

##检查当前文件($file)是否存在且为普通文件(非目录、设备文件等)

 

      newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`

##使用 sed 命令将文件名中的OLD变量(即传入的正则表达式)替换为##NEW变量(即替换字符串),并将新文件名赋值给变量newfile。

 

      if [ -f "$newfile" ]; then

        echo "ERROR: $newfile exists already."

      else

        echo "Renaming $file to $newfile."

        mv "$file" "$newfile"

      fi

##检查新文件名($newfile)是否已存在。如果存在,输出错误信息;否

则,输出重命名信息,并使用 mv 命令将原文件名($file)重命名为新文件名($newfile)。

    fi

done

c8e9936897a540eea66401c843da70b0.png

 

Eg47、getops使用分析-实例1

#!/bin/bash

## filename : pp_parse_getopts_1.sh

while getopts  "abc:def:ghi" flag

do

  echo "$flag" $OPTIND $OPTARG

done

echo "Resetting"

OPTIND=1

while getopts  "bc:def:ghi" flag

do

  echo "$flag" $OPTIND $OPTARG

Done

2f0a5ea273a940f7a40a732109555f6b.png

 

这是一个使用`getopts`命令处理命令行选项的Bash脚本。

- 使用`getopts`命令解析命令行选项。参数`"abc:def:ghi"`定义了可接受的选项及其特性:

  - `a`, `b`, `c`: 无参数的选项。

  - `d`, `e`, `f`: 需要接一个参数的选项(参数由`:`后跟的字母标识)。

  - `g`, `h`, `i`: 同样是无参数的选项。

 

  `getopts`会在循环中逐一处理这些选项及其可能的参数。每次迭代中:

  - `flag`变量保存当前处理的选项字符(如`a`、`b`、`d`等)。

  - `echo "$flag" $OPTIND $OPTARG`打印当前选项字符、当前选项索引(`$OPTIND`)以及选项参数(如果有的话,保存在`$OPTARG`中)。

 

- 输出消息“Resetting”,表明即将重新开始解析选项。

 

- 将`OPTIND`(选项索引)重置为1,以便重新从头开始解析选项。

 

- 第二次使用`getopts`命令解析相同的选项集。由于`OPTIND`已被重置,这次解析将从头开始处理命令行选项,就像第一次从未发生过一样。

 

该脚本使用`getopts`命令两次解析相同的命令行选项集(`"abc:def:ghi"`)。每次解析过程中,脚本会打印出当前处理的选项字符、选项索引及可能的选项参数。第二次解析之前,脚本重置了`OPTIND`,使得第二次解析如同第一次一样从头开始。

Eg48、getops使用分析-实例2

linux@LAPTOP-X280:~$ cat 48eg.sh

#!/bin/bash

## filename : pp_parse_getopts_1.sh

while getopts  ":abc:def:ghi" flag

do

  echo "$flag" $OPTIND $OPTARG

done

echo "Resetting"

OPTIND=1

while getopts  ":bc:def:ghi" flag

do

  echo "$flag" $OPTIND $OPTARG

done

 

c6be3f58d95340189ff027b463a225d9.png

 

Eg49、getops使用分析-实例3-

#!/bin/bash

## filename : mybackup_getopts.sh

while getopts :zc:x:rv opt

do

  case $opt in

    c) ConfFile=$OPTARG       ;;

    x) ExcludeFile=$OPTARG    ;;

    z) Compress=true          ;;

    r) Recursive=true         ;;

    v) Verbose=true           ;;

    :)

      echo "$0: Must supply an argument to -$OPTARG." >&2

      exit 1

      ;;

    \?) echo "Invalid option -$OPTARG ignored." >&2   ;;

  esac

done

 

shift $((OPTIND-1)) ; echo $0 ; echo "$@"

<--undo-->

Eg50、getops使用分析-实例4-

#!/bin/bash

## filename : mybackup_getopts2.sh

while getopts :zc:x:rv opt

do

  case $opt in

    c) if [[ $OPTARG = -* ]]; then  ((OPTIND--)) ;  continue ;  fi

       ConfFile=$OPTARG       ;;

    x) ExcludeFile=$OPTARG    ;;

    z) Compress=true          ;;

    r) Recursive=true         ;;

    v) Verbose=true           ;;

    :)

      echo "$0: Must supply an argument to -$OPTARG." >&2

      exit 1

      ;;

    \?) echo "Invalid option -$OPTARG ignored." >&2   ;;

  esac

done

 

shift ((OPTIND-1)) ; echo $0 ; echo "$@"

<--undo-->

Eg51、函数实现的backup菜单

#!/bin/bash

## filename: all_in_one_backup_select.sh

### User define Function (UDF) ###

sql_bak  () { echo "Running mysqldump tool..."; }

sync_bak () { echo "Running rsync tool..."; }

git_bak  () { echo "Running gistore tool..."; }

tar_bak  () { echo "Running tar tool..."; }

### Main script starts here ###

PS3="Please choose a backup tools : "

select s in  mysqldump rsync gistore tar quit ; do

  case $REPLY in

       1) sql_bak  ;;

       2) sync_bak ;;

       3) git_bak  ;;

       4) tar_bak  ;;

       5) exit     ;;

  esac

done

 

d05654b8d7184ba38182c17d17fa0f32.png

 

Eg52、函数的局部变量例子

#!/bin/bash

## filename: pp_and_function.sh

echo "===Print positional parameters in main :"

echo "$0: $*"

pp1(){

  echo 'f1--Print $* parameters in fun1 :' ; echo "$0: $*"

}

pp2(){

  echo 'f2--Print $* parameters in fun1 :' ; echo "$0: $*"

  pp1 1st 2nd 3th 4th 5th 6th 7th 8th 9th

  echo 'f2--Print $* parameters in fun1 :' ; echo "$0: $*"

}

pp1 1 2 3 4 5 6 7 8 9

echo "===Print positional parameters in main :"

echo "$0: $*"

pp2 I II III IV V VI VII VIII IX

952415f4d9254e8dbe7c33e3bcf89c3e.png

 

Eg53、位置参数函数-比大小

#!/bin/bash

## filename: function_max.sh

# User define Function (UDF)

usage () {

  echo "List the MAX of the positive integers in command line. "

  echo "Usage: `basename $0` <num1> <num2> [ <num3> ... ]"

  exit

}

max () {

  [[ -z $1 || -z $2 ]] && usage

  largest=0

  for i ; do  ((i>largest)) && largest=$i ; done

}

### Main script starts here ###

max "$@"

echo "The largest of the numbers is $largest."

0fd8a8e67ab0419f8d55acc6563fa4e0.png

 

Eg54、函数的返回值调用-实例

#!/bin/bash

## filename: function_max2.sh

# User define Function (UDF)

max2 () {

  if [[ -z $1 || -z $2 ]] ; then

    echo  "Need 2 parameters to the function." ; exit

  fi

  [ $1 -eq $2 ] &&

       { echo "The two numbers are equal." ; exit ; }

  (($1>$2)) && return $1 || return $2

}

### Main script starts here ###

read -p "Please input two integer numbers  : " n1 n2

echo "n1=$n1 , n2=$n2"

max2 $n1 $n2

return_val=$?

echo "The larger of the two numbers is $return_val."

7d704b7f957843debc18e5f439731c07.png

Eg55、标准输出返回函数值

#!/bin/bash

## filename: function_to-upper.sh

# User define Function (UDF)

to_upper () {

    local str="$@"

    local output

    output=$(tr '[a-z]' '[A-Z]'<<<"${str}")

    echo $output

}

### Main script starts here ###

to_upper "This Is a TEST"

 

res=$(to_upper "$@")

echo "$res"

 

res=$(to_upper "$1")

[[ $res == "YES" ]] && echo "Continue..." || echo "Stop"

f45314fdbfc248f4b2f0d6b0ffb82085.png

55个实例完结。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个在高校打杂的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值