拓扑园

  • O&M
    • Universal部署
    • PHP+VUE+Laravel相关
  • Oracle性能优化
  • Oracle项目案例
    • Oracle近期项目案例(目录)
    • Oracle实战问题解析(目录)
    • Oracle数据库名变更流程(2种方式)
    • Oracle数据库目录更换流程(使用Oracle的clone工具)
    • Oracle数据库迁移方案(目录)
    • 标准化文档系列
  • Oracle基础知识
    • LLL的Oracle培训(分类)
    • LLL的docker培训(分类)
    • 标准化文档系列--(分类)
    • Oracle核心经典分析(分类)
    • 图灵小队----(分类并包含以下文章)
    • --MySQL8.0/Oracle/Memcached/Redis等安装配置于RHEL/OL6/7/8.X系列-运行环境最优配置
    • --PG安装配置于RHEL/9X系列-运行环境最优配置
    • --自动维护任务详解-开启、关闭信息统计收集(统计信息)
    • --图灵小队—Oracle/PostgreSQL下创建一个用户测试表(自行定义数据行)
    • --图灵小队-Oracle存储过程导出表的明细_UTL_FILE(文章)
    • --图灵小队-Oracle数据库删除/卸载操作指南(文章)
    • --图灵小队-Oracle常用性能查询SQL语句(文章)
    • --图灵小队-Oracle数据库上线前检查(文章)
    • --图灵小队-Oracle常用SQL语句(文章)
    • --图灵小队—Linux/Oracle脚本/MySQL合集(持续更新)
    • --图灵小队-Oracle技巧记录(文章)
    • ADG
    • RAC
    • ASM
    • OGG
    • RMAN
    • EXPDP/IMPDP
    • 工厂数据导入导出系列
  • MySQL
    • MySQL数据库规范
    • MySQL项目案例
    • MySQL安装配置
    • MYSQL集群项目
    • MySQL常见处理
    • MySQL-Sysbench专题
    • MySQL-Percona Toolkit专题
  • Linux
    • Shell编程
    • kubernetes
    • docker
    • Linux
    • PHP
    • Nginx
    • haproxy
    • mail
    • 网站
    • 域名
    • 网址收藏
  • 数据中心
    • 新框架系统集合
    • 工作文档
    • EBS数据文件扩容
    • VMware虚拟化
    • EBS系列
    • 大数据
    • SVN
    • zabbix
    • SAP
    • 备份相关
    • FC交换机
    • SVN
  • K-Studing
    • D8-Python学习
    • Oracle/MySQl等面试题
    • LG-MySQL
    • LG-Docker/K8S
    • LG-PostgreSQL
    • LG-ORACLE_BBED
    • LG-ORACLE
    • LG-Elasticsearch(ES)+ELK
    • Oracle-19C-OCP
    • WERN_ORACLE培训
    • redis数据库
    • Nginx培训学习系列
  • 其他
    • 外研英语4年级下册-听力
    • 影视系列
    • 如何使用iTunes软件通过抓包下载旧版本的ios的app
天高任鸟飞
Oracle/MySQL数据库恢复/数据迁移/生产规范报告技术交流:TEL:18562510581(微信同号);加微信入群
  1. 首页
  2. Linux
  3. Shell编程
  4. 正文

Linux Shell编程—案例100之(31-55)

2024年4月24日 979点热度 0人点赞 0条评论

接第二部分,此为第三部分:第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

具体执行都是一样的:

 

 

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

 

##该 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

 

 

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

 

 

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

 

 

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下的检测包安装命令

执行如下:

 

选择1后,

 

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

 

 

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

 

 

 

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

 

 

 

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

 

 

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

 

 

 

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

 

 

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

 

 

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

 

 

这是一个使用`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

 

 

 

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

 

 

 

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

 

 

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."

 

 

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."

 

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"

 

55个实例完结。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/xh_w20/article/details/138012030

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2024年4月25日

admin

这个人很懒,什么都没留下

打赏 点赞
< 上一篇

COPYRIGHT © 2022 拓扑园. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

鲁ICP备2021020523号

鲁ICP备2021020523号