[ Content contribution] 基于deepin的shell编程-函数与图形化编程
Tofloor
poster avatar
天阁创客official
deepin
2023-12-30 01:51
Author

函数

9.1脚本函数基础

函数在这里是一个脚本代码块,你可以为其命名并在脚本中的任何位置重用它。每当需要在脚本中使用该代码块时,直接写函数名即可(这叫作调用函数)。

9.2创建函数

语法

 NO.1:
 function name {
 commands
 }
 NO.2:
 name() {
 commands
 }
 

** **

 zql@zql-PC:~$ cat function1.sh
 #!/bin/bash
 #函数
 echo "Creating a function."
 function fun1 {
         echo "This is an explame of a function."
 }
 count=1
 while [ $count -le 5 ]
 do
         fun1
         count=$[ $count + 1 ]
 done
 echo "This is the end of the loop."
 fun1
 echo -e "No this is the end of the script.\n"
 
 
 echo "Creating second function. "
 fun2() {
         top
 }
 echo "调用函数top:" ; sleep 1
 fun2
 exit
 
 
 zql@zql-PC:~$ ./function1.sh
 Creating a function.
 This is an explame of a function.
 This is an explame of a function.
 This is an explame of a function.
 This is an explame of a function.
 This is an explame of a function.
 This is the end of the loop.
 This is an explame of a function.
 No this is the end of the script.
 
 Creating second function.
 调用函数top:
 top - 23:31:39 up  2:32,  1 user,  load average: 0.15, 0.15, 0.10
 任务: 167 total,   1 running, 166 sleeping,   0 stopped,   0 zombie
 %Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
 MiB Mem :   3887.8 total,   3163.7 free,    579.7 used,    364.6 buff/cache
 MiB Swap:    975.0 total,    975.0 free,      0.0 used.   3308.1 avail Mem
 
  进程号 USER      PR  NI    VIRT    RES    SHR    %CPU  %MEM     TIME+ COMMAND
       1 root      20   0  167532  12068   8960 S   0.0   0.3   0:00.94 systemd
       2 root      20   0       0      0      0 S   0.0   0.0   0:00.01 kthreadd
       3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp
       4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp
       5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 slub_flushwq
       6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 netns
       8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri
      10 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq

9.3 函数的返回值

函数的退出状态码很,只有当最后的命令执行成功的时候才会返回0,反之则返回1。

当使用return后会以特定的退出状态码退出函数。

注意:函数执行一结束就立刻读取返回值。退出状态码必须介于0~255。

9.4 函数中使用变量

在脚本中调用函数时,必须将参数和函数名放在同一行。

 $ cat badtest1
 #!/bin/bash
 # trying to access script parameters inside a function
 
 function badfunc1 {
    echo $[ $1 * $2 ]
 }
 
 if [ $# -eq 2 ]
 then
    value=$(badfunc1)
    echo "The result is $value"
 else
    echo "Usage: badtest1 a b"
 fi
 $
 $ ./badtest1
 Usage: badtest1 a b
 $ ./badtest1 10 15
 ./badtest1: *  : syntax error: operand expected (error token is "*
 ")
 The result is
 $
 
 #该脚本来源与Linux命令行与shell脚本编程大全

9.5 在函数中处理变量

给shell脚本程序员带来麻烦的情况之一就是变量的作用域。主要是全局变量和而局部变量。

全局变量可以这样来看,一个变量所有的函数都能调用它那就是全局变量。

局部变量只有在当前函数才能调用,其他函数无法调用它。局部变量前面都有一个关键字local

9.6 数组变量和函数

 $ cat test12
 #!/bin/bash
 # returning an array value
 
 function arraydblr {
    local origarray
    local newarray
    local elements
    local i
    origarray=($(echo "$@"))
    newarray=($(echo "$@"))
    elements=$[ $# - 1 ]
    for (( i = 0; i <= $elements; i++ ))
    {
       newarray[$i]=$[ ${origarray[$i]} * 2 ]
    }
    echo ${newarray[*]}
 }
 
 myarray=(1 2 3 4 5)
 echo "The original array is: ${myarray[*]}"
 arg1=$(echo ${myarray[*]})
 result=($(arraydblr $arg1))
 echo "The new array is: ${result[*]}"
 $
 $ ./test12
 The original array is: 1 2 3 4 5
 The new array is: 2 4 6 8 10
 
 #该脚本来源与Linux命令行与shell脚本编程大全

9.7 函数递归

局部函数变量的一个特性是自成体系(self-containment)。除了获取函数参数,自成体系的函数不需要使用任何外部资源。这个特性使得函数可以递归地调用,也就是说函数可以调用自己来得到结果。递归函数通常有一个最终可以迭代到的基准值。许多高级数学算法通过递归对复杂的方程进行逐级规约,直到基准值。

9.8 创建库

bash shell允许创建函数库文件,然后在多个脚本中引用此库文件。这个过程的第一步是创建一个包含脚本中所需函数的公用库文件。

 zql@zql-PC:~$cat myfunction.sh
 #!/bin/bash
 #my function
 add() {
     echo $ [$1 + $2 ]
 }
 
 cfa() {
     echo $[ $1 * $2 ]
 }
 
 div() {
    if [ $2 -ne 0 ]
    then
            echo $[ $1 / $2 ]
    else
            echo -1
    fi
 }

调用上面的函数库需要用到source命令,点号操作符,在脚本文件前面添加上../即可

 $ cat test14
 #!/bin/bash
 # using functions defined in a library file
 . ./myfunction.sh
 
 value1=10
 value2=5
 result1=$(addem $value1 $value2)
 result2=$(multem $value1 $value2)
 result3=$(divem $value1 $value2)
 echo "The result of adding them is: $result1"
 echo "The result of multiplying them is: $result2"
 echo "The result of dividing them is: $result3"
 
 $ ./test14
 The result of adding them is: 15
 The result of multiplying them is: 50
 The result of dividing them is: 2
 
 #该脚本来源与Linux命令行与shell脚本编程大全

9.9 命令行创建函数

 #例1
 $ function divem { echo $[ $1 / $2 ];  }
 $ divem 100 5
 20
 
 #例2
 $ function multem {
 > echo $[ $1 * $2 ]
 > }
 $ multem 2 5
 10
 
 #该脚本来源与Linux命令行与shell脚本编程大全

注意:在命令行创建函数时要特别小心。如果给函数起了一个跟内建命令或另一个命令相同的名字,那么函数就会覆盖原来的命令。

9.10 在.bashrc文件中定义函数

要解决命令行创建函数的问题,就要在.bashrc文件里面进行修改,因为bash shell在每次启动时都会在用户主目录中查找这个文件

直接定义函数

可以直接在用户主目录的.bashrc文件中定义函数。大多数Linux发行版已经在该文件中定义了部分内容,注意不要误删,只需将函数放在文件末尾即可。

 $ cat .bashrc
 # .bashrc
 
 # Source global definitions
 if [ -r /etc/bashrc ]; then
         . /etc/bashrc
 fi
 
 function addem {
    echo $[ $1 + $2 ]
 }
 #该脚本来源与Linux命令行与shell脚本编程大全

源引函数文件

利用source来指定路径即可。

 $ cat .bashrc
 # .bashrc
 
 # Source global definitions
 if [ -r /etc/bashrc ]; then
         . /etc/bashrc
 fi
 
 . /home/rich/libraries/myfuncs
 #该脚本来源与Linux命令行与shell脚本编程大全

shtool库函数

1 Arx 创建归档文件(包含一些扩展功能)
2 Echo 显示字符串,并提供一些扩展构键
3 fixperm 改变目录树中的文件权限
4 install 安装脚本或文件
5 mdate 显示文件或目录的修改时间
6 mkdir 创建一个或更多目录
7 Mkln 使用相对路径创建链接
8 mkshadow 创建一棵阴影树
9 move 带有替换功能的文件移动
10 Path 处理程序路径
11 platform 显示平台标识
12 Prop 显示一个带有动画效果的进度条
13 rotate 转置日志文件
14 Scpp 共享的C预处理器
15 Slo 根据库的类别,分离链接器选项
16 Subst 使用sed的替换操作
17 Table 以表格的形式显示由字段分隔的数据
18 tarball 从文件和目录中创建tar文件
19 version 创建版本信息文件

图形化编程

创建文本菜单

10.1 创建菜单布局

 zql@zql-PC:~$ cat GUI1.sh
 #!/bin/bash
 
 echo -e "\t\t\tSys Admin Menu\n"
 echo -e "\t1. Display dis space"
 echo -e "\t2. Display logged on users"
 echo -e "\t3. Display memory usage"
 echo -e "\t0. Exit menu\n\n"
 echo -en "\t\tEnter option"

运行脚本文件如下:
image-20231229165025891.png

10.2 创建菜单函数

修改上面的代码

 zql@zql-PC:~$ sudo vim GUI1.sh
 
 #!/bin/bash
 #创建一个GUI程序
 
 #菜单函数
 menu() {
         clear
         echo
         echo -e "\t\t\tSys Admin Menu\n"
         echo -e "\t1. Display dis space"
         echo -e "\t2. Display logged on users"
         echo -e "\t3. Display memory usage"
         echo -e "\t0. Exit menu\n\n"
         echo -en "\t\tEnter option"
         #获取用户输入
         read -n 1 option
 }

嵌入case语句,添加一定的逻辑结构。

 zql@zql-PC:~$ cat GUI1.sh
 #!/bin/bash
 #创建一个GUI程序
 
 #菜单函数
 menu() {
         clear
         echo
         echo -e "\t\t\tSys Admin Menu\n"
         echo -e "\t1. Display dis space"
         echo -e "\t2. Display logged on users"
         echo -e "\t3. Display memory usage"
         echo -e "\t0. Exit menu\n\n"
         echo -en "\t\tEnter option"
         #获取用户输入
         read -n 1 option
 }
 
 #访问磁盘空间
 diskspace() {
         clear
         df -k
 }
 
 #谁访问,用户
 whoseon() {
         clear
         who
 }
 
 #查看
 memusage() {
         clear
         cat /proc/meminfo
 }
 
 #
 while [ 1 ]
 do
         menu
         case $option in
                 0)
                         break ;;
                 1)
                         diskspace ;;
                 2)
                         whoseon ;;
                 3)
                         memusage ;;
                 *)
                         clear
                         echo "Sorry, wrong selection" ;;
         esac
         echo -en "\n\n\t\t\tHIt any key to continue"
         read -n 1 line
 done
 clear

脚本运行结果如下:
图片.png

选择功能会使用到select命令。

语法

 select variable in list
 do
     conmmands
 done  

修改后

 zql@zql-PC:~$ cat GUI1.sh
 
 #!/bin/bash
 #创建一个GUI程序
 
 #菜单函数
 menu() {
         clear
         echo
         echo -e "\t\t\tSys Admin Menu\n"
         echo -e "\t1. Display dis space"
         echo -e "\t2. Display logged on users"
         echo -e "\t3. Display memory usage"
         echo -e "\t0. Exit menu\n\n"
         echo -en "\t\tEnter option"
         #获取用户输入
         read -n 1 option
 }
 
 #访问磁盘空间
 diskspace() {
         clear
         df -k
 }
 
 #谁访问,用户
 whoseon() {
         clear
         who
 }
 
 #查看
 memusage() {
         clear
         cat /proc/meminfo
 }
 
 #
 
 PS3="Enter option:"
 select option in "Display disk space" "Dispaly logged on users" ~CA "Display memory usage" "Exit progame"
 do
         case $option in
                 "Exit progame")
                         break ;;
                 "Display disk space")
                         diskspace ;;
                 "Display logged on users")
                         whoseon ;;
                 "Display memory usage")
                         memusage ;;
                 *)
                         clear
                         echo "Sorry, wrong selection" ;;
         esac
 
 done
 clear

脚本运行结果如下:
图片.png

创建文本窗口部件

dialog软件包最早是Savio Lam编写的一款小巧的工具,现在由Thomas E. Dickey负责维护。dialog能够用ANSI转义控制字符,在文本环境中创建标准的窗口对话框。你可以轻而易举地将这些对话框融入自己的shell脚本中,以实现与用户的交互。

语法

 dialog --widget parameters

widget是部件的名字,parameter定义了部件的窗口大小以及部件需要的文本。dialog的两种输出形式:STDERR、退出状态码。yes代表状态码0,cancle代表1。

11.1 msgbox对话框

该部件主要是创建一个窗口文本内容。

 dialog --title Test --msgbox "This is a test" 10 20

运行结果如下:
image-20231229171019421.png

11.2 yesno选择键

该部件主要是在窗口的底部生成两个按钮:Yes、No。

 dialog --title "Please answer" --yesno "Is this thing on?" 15 25

运行结果如下:
image-20231229171248599.png

11.3 inputbox输入框

该部件主要是用来接收用户的输入,在文本框内输入文本字符,dialog会将文本字符发动到STDERR。必须使用重定向来获取用户的输入。

 dialog --inputbox "Enter your age:" 10 20 2>/home/hacker/mytext/age.txt

运行结果如下:
image-20231229171532833.png

11.4 textbox文本显示

textbox部件主要是用来显示大量的文本信息的部件。

 dialog --textbox /etc/passwd 20 55

运行结果如下:

图片违规-无法上传

11.5 menu菜单

和字面意思一样,该部件会创建一个文本菜单。

 dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage"

运行结果如下:
image-20231229171858321.png

11.6 fselect内置部件

fselect可以浏览文件的位置

 dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt

运行结果如下:

image-20231229172052009.png

注意在脚本中使用dialog命令的两条规则:

如果由Cancle或者No按钮,请检查dialog命令的退出状态码

重定向STDERR来获取输出的值


Reply Favorite View the author
All Replies
小小怪下士
deepin
2023-12-30 03:26
#1

学习一下~

Reply View the author
天阁创客official
deepin
2023-12-30 03:50
#2
小小怪下士

学习一下~

Shell图形化编程主要用户命令行里面的编程,要想开发出累死deepin一样的界面还是要用到c、c++

Reply View the author
小小怪下士
deepin
2023-12-30 04:12
#3
天阁创客official

Shell图形化编程主要用户命令行里面的编程,要想开发出累死deepin一样的界面还是要用到c、c++

主要写一些日常自动化脚本

Reply View the author
天阁创客official
deepin
2023-12-30 04:18
#4
小小怪下士

主要写一些日常自动化脚本

嗯,自动化脚本嘛,我以前学运维的时候就经常用脚本运行,快捷pride

Reply View the author
nexfia
deepin
2023-12-30 06:40
#5

like

Reply View the author
神末shenmo
deepin
Spark-App
2023-12-30 07:14
#6

图形还是推荐zenity

Reply View the author
linux000
deepin
2024-01-28 21:25
#7

666👍

Reply View the author