shell脚本编程的例子(55例子)-3

第三部分:eg32-eg50shell例子。开放一周后启用vip阅读了。……

^v^

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"

----shell50实例结束分隔符---

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/560678.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rokid AR Lite空间计算套装发布,软硬件全面升级推动居家、出行、户外场景大规模应用

4月20日&#xff0c;以“好玩、好看、好上头”为主题的Rokid Open Day 2024发布会在杭州举行&#xff0c;Rokid对外正式发布新一代AR Lite空间计算套装&#xff0c;分享了近期Rokid在AR开发者生态和数字文化领域的进展和成果&#xff0c;并宣布了多项跨行业重磅合作。作为中国代…

PS-ZB转座子分析流程2-重新分析并总结

数据处理 数据质控 随机挑出九个序列进行比对&#xff0c;结果如下&#xff1a; 所有序列前面的部分序列均完全相同&#xff0c;怀疑是插入的转座子序列&#xff0c;再随机挑选9个序列进行比对&#xff0c;结果如下&#xff1a; 结果相同&#xff0c;使用cutadapt将该段序列修…

OerOerlikonTCO1200欧瑞康LPCVD system操作使用说明

OerOerlikonTCO1200欧瑞康LPCVD system操作使用说明

常见的经典目标检测算法

目标检测是计算机视觉领域的一个核心任务&#xff0c;它涉及到识别图像中的物体并确定它们的位置。以下是一些常见的经典目标检测算法&#xff1a; R-CNN系列 R-CNN&#xff08;Region-based Convolutional Neural Network&#xff09;是一种用于目标检测的算法&#xff0c;它…

PyQt5开发的DSP信号仿真系统

PyQt5开发的DSP信号仿真系统 1、效果图 2、功能 具备的功能: 1、生成基础信号波形[正弦波,脉冲函数,阶跃函数,斜坡函数, 锯齿波,方波,常见非周期波形,sinc函数] 2、各基础波形可以叠加 3、可展示FFT频谱、信号卷积、功率频谱密度估计 4、可以读取音频信号及分析 5、各…

第23天:安全开发-PHP应用后台模块SessionCookieToken身份验证唯一性

第二十三天 一、PHP后台身份验证模块实现 二、Cookie&Session技术&差异 1.生成cookie的原理图过程&#xff1a;见上图 客户端向服务器发送HTTP请求。服务器检查请求头中是否包含cookie信息。如果请求头中包含cookie信息&#xff0c;则服务器使用该cookie来识别客户端…

Android Studio Iguana | 2023.2.1配置优化

一. 前言 本篇文章记录最新版本的Android Studio的配置优化&#xff0c;写这篇文章的是由于电脑中的AS工具更新版本覆盖安装后&#xff0c;AS会经常卡死&#xff0c;Debug的时候也经常莫名其妙的断掉&#xff0c;非常影响工作效率&#xff0c;所以重新把配置环境整理一下&#…

保姆级教程!QRCNN-BiLSTM一键实现多变量回归区间预测!区间预测全家桶再更新!

​ 声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 今天对我们之前推出的区间预测全家桶进行…

详解数据在内存中的存储

系列文章目录 第一章 C语言基础知识 第二章 C语言控制语句 第三章 C语言函数详解 第四章 C语言数组详解 第五章 C语言操作符详解 第六章 C语言指针详解 第七章 C语言结构体详解 文章目录 1. 数据类型 1.1 基本数据类型 1.2 派生数据类型 2. 整形在内存中的存储 2.1 …

AOP基础-动态代理

文章目录 1.动态代理1.需求分析2.动态代理的核心3.代码实例1.Vehicle.java2.Car.java3.Ship.java4.VehicleProxyProvider.java(动态代理模板)5.测试使用 2.动态代理深入—横切关注点1.需求分析2.四个横切关注点3.代码实例1.Cal.java2.CalImpl.java3.VehicleProxyProvider02.jav…

第 2 章:FFmpeg简介

2.1 历史 历史 一些相关术语介绍&#xff1a; 容器&#xff08;Container&#xff09;格式&#xff1a;一种文件封装格式&#xff0c;里边主要包含了流&#xff0c;一般会使用一个特定的后缀名标识&#xff0c;例如.mov、.avi、.wav等。流 &#xff08;Stream&#xff09;&am…

大语言模型隐私防泄漏:差分隐私、参数高效化

大语言模型隐私防泄漏&#xff1a;差分隐私、参数高效化 写在最前面题目6&#xff1a;大语言模型隐私防泄漏Differentially Private Fine-tuning of Language Models其他初步和之前的基线微调模型1微调模型2通过低秩自适应进行微调&#xff08; 实例化元框架1&#xff09; 在隐…

pta L1-063 吃鱼还是吃肉

L1-063 吃鱼还是吃肉 分数 10 全屏浏览 切换布局 作者 陈越 单位 浙江大学 国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重为 27 公斤&#xff1b;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。 现在你要根据小宝宝的身高体重&#xff0c;给出补充营养的…

浅谈 刷算法题时遇到运行超时异常 的解决办法

文章目录 一、背景介绍二、解决办法2.1 C/C 语言2.2 Java 语言2.2.1 ACM模式下 Java的I/O原理 三、模板详情 一、背景介绍 最近在牛客、leetcode 刷算法题时发现一个奇怪的问题&#xff0c;明明解题思路、所用算法与题解一致&#xff0c;并且在本地IDE运行是通过的&#xff0c…

【HTML】H5新增元素记录

H5 新增元素特性 1. 语义化标签 语义化标签的好处&#xff1a; 对于浏览器来说&#xff0c;标签不够语义化对于搜索引擎来说&#xff0c;不利于SEO的优化 语义化标签&#xff1a; header:头部元素nav&#xff1a;导航section:定义文档某个区域的元素article:内容元素aside…

深度学习:Pytorch分布式训练

深度学习&#xff1a;Pytorch分布式训练 简介模型并行数据并行参考文献 简介 在深度学习领域&#xff0c;模型越来越庞大、数据量不断增加&#xff0c;训练这些大型模型越来越耗时。通过在多个GPU或多个节点上并行地训练模型&#xff0c;我们可以显著减少训练时间。此外&#…

python学习 | 我有两个dataframe,想通过某1列进行匹配

需求 我有两个dataframe&#xff0c;第1个dataframe A的columns是[‘id’, ‘A’, ‘B’, ‘C’]&#xff0c;第2个dataframe B的columns是[‘id’, ‘1’, ‘2’, ‘3’]&#xff0c;其中’id’列A是B的子集&#xff0c;我想通过’id’列进行匹配&#xff0c;把A给扩充成[‘i…

js 特定索引下拆分字符串并组建成新的字符串数据

要在特定索引处拆分字符串&#xff0c;请使用 slice 方法获取字符串的两个部分&#xff0c;例如 str.slice(0, index) 返回字符串的一部分&#xff0c;但不包括提供的索引&#xff0c;而 str.slice(index) 返回字符串的其余部分。 过程&#xff1a;我们创建一个可重用的变量&a…

「GO基础」目录

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

删除word中下划线的内容

当试卷的题目直接含答案&#xff0c;不利用我们刷题。这时如果能够把下划线的内容删掉&#xff0c;那么将有利于我们复习。 删除下划线内容的具体做法&#xff1a; ①按ctrl H ②点格式下面的字体 ③选择下划线线型中的_____ ④勾选使用通配符并在查找内容中输入"?&qu…