shell

一些文章:

shell 运行原理和Linux权限详解

便捷的vim操作:

vi、vim操作

取消高亮显示:
    命令行下,:noh 
    #取消高亮,有时候将某个地方高亮显示了,看着不舒服,在命令行模式下使用

调整文本格式:
    命令行下,键v以后,用上下左右键将需要调整的文本选中,再+加号即可
    #将文本按正常格式重新排列

一、shell基础

1、什么是shell?

    Shell是一个命令行解释器,它为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序。
用户可以用Shell来启动、挂起、停止、编程等操作。
    Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
    Shell还是一个功能强大的编程语言、编写方面、调试方便、灵活性强。
    Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

2、linux默认Shell?

    /bin/bash

3、查看当前系统的shell

查看当前系统有哪些shell
    cat /etc/shells 
查看当前是什么shell
    echo $SHELL 

4、权限相关命令 chmod

linux分为:
    超级用户(根目录、安装软件)
    普通用户

修改文件权限:
    rwxrwxrwx
    文件所有者、组用户、其他用户
    字母法:chmod (u g o a)(+ - =)(r w x)(文件名)
    数字法:chmod + 数字组合 + 文件名

(u g o a): 这部分指定权限适用的对象
    u 代表文件所有者的权限
    g 代表与文件所有者同组的用户的权限
    o 代表其他所有用户的权限
    a 代表所有用户,包括文件所有者、组用户和其他用户
(+ - =): 这部分指定权限的操作
    + 代表添加权限
    - 代表移除权限
    = 代表设置确切的权限,覆盖之前的权限
(r w x): 这部分指定具体的权限
    r 代表读权限(read)
    w 代表写权限(write)
    x 代表执行权限(execute)

数字组合:采用八进制
    777:111 111 111
    (文件所有者、组用户、其他用户:都有读、写、执行权限)
    666:110 110 110 
    (文件所有者、组用户、其他用户:都有读、写权限)
    444:100 100 100
    (文件所有者、组用户、其他用户:都有读权限)
    222:010 010 010
    (文件所有者、组用户、其他用户:都有写权限)
    111:001 001 001
    (文件所有者、组用户、其他用户:都有执行权限)

5、基本命令

pwd
ls
cd
mkdir
rmdir
cp
mv
touch
clear
man

data - 打印或设置系统日期和时间
    date +%T        24/03/22
    date +%Y/%m/%d  2024/03/22
    date +%H:%M     15:16
    date +"当前时间为:%Y/%m/%d %H:%M:%S"                当前时间为:2024/03/22 15:15:35 
    date +"三个月之后:%Y/%m/%d %H:%M:%S" -d "+3 month"  三个月之后:2024/06/22 15:16:19
    date +"三天前:%Y/%m/%d  %H:%M:%S" -d "-3 day"       三天前:2024/03/19  15:16:24
    date -s "20300111 19:43:44"    设置日期

6、输入输出相关 echo > <

输出命令:
    echo    将字符串回显到标准输出
        linux@linux:~$ echo hello
        hello

输入输出重定向:

1、什么是重定向?
    改变shell命令或程序默认的标准输入/输出目标,重新定向到新的目标
2、默认的输入输出位置是哪里?
    linux中默认的标准输入定义为键盘,标准输出定义为终端窗口
    标准输入:(stdin,文件描述符为0):默认从键盘输入
    标准输出:(stdout,文件描述符为1):默认输出到屏幕。 
    标准出错:(stderr,文件描述符为2):默认输出到屏幕。
3、什么要使用重定向?
    <1>当屏幕输出的信息很重要时,而且希望保存重要的信息时
    <2>后台执行中的程序,不希望它干扰屏幕正常的输出结果时
    <3>系统的例行命令,例如定时任务的执行结果,希望他可以存下来
    <4>一些执行命令,我们已经知道他可能出现错误信息,想把它直接丢掉时
    <5>执行一个命令,可能报错和正确的输出并序,类似错误日志与标准正确日志需要分别输出至不同的文件。

输入重定向:

输入重定向符含义实例
<file将file文件重定向为输入源wc<file,将file中的内容作为输入传给wc命令
<<分界符

表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串

cat<<9,当遇到输入9时,输入结束
命令<文件1>文件2

将文件 1 作为命令的输入设备,该命令的执行结果输出到文件 2 中。

cat<file<log,file作为cat命令的输入,把cat的输出结果输出到log文件中

7、通配符 * ? [ ]

通配符是一种特殊语句,通配符是用来代替字符的

linux@ubuntu:~/mywork$ ls  file_*.txt
file_liu.txt   file_wang.txt   file_lee.txt   file_song.txt

linux@ubuntu:~/mywork$ ls  file_?.txt
file_1.txt   file_2.txt   file_3.txt   file_4.txt   file_5.txt

linux@ubuntu:~/mywork$ ls   file_[1-5].txt
file_1.txt   file_2.txt   file_3.txt   file_4.txt   file_5.txt

linuxx@ubuntu:~/mywork$ ls   file_[^245].txt
file_1.txt   file_3.txt
通配符含义实例
星号*匹配任意长度的字符串用file_*.txt,匹配file_wang.txtfile_Lee.txt、file3_Liu.txt
问号?匹配一个长度的字符flie_?.txt,匹配file_1.txtfile1_2.txtfile_3.txt
方括号[...]匹配其中指定的一个字符file_[otr].txt,匹配file_o.txtfile_r.txtfile_t.txt
方括号[ - ]匹配指定的一个字符范围file_[a-z].txt,匹配file_a.txtfile_b.txt,直到file_z.txt
方括号[^...]除了其中指定的字符,均可匹配file_[^otr].txt,除了file_o.txtfile_r.txtfile_t.txt的其他文件

8、管道 |

    管道可以把一系列命令连接起来,意味着第一个命令的输出将作为第二个命令的输入,
通过管道传递给第二个命令,第二个命令的输出又将作为第三个命令的输入,以此类推。
就像通过使用“|”符连成了一个管道。

9、历史查询 history

二、文件相关shell命令

1、查看文件 cat

cat    将文件信息显示在标准输出(屏幕)上

2、查找文件 find grep

find    在目录层次结构中搜索文件

find [起始目录] 寻找条件 操作
选项:
    -name    '字串'查找文件名匹配所给字串的所有文件,字串内可用通配符 *、?、[ ]。
    -iname   '字串' 忽略大小写的方式查找
    -type x  查找类型为 x 的文件
    -exec 命令名称 {}  
             对符合条件的文件执行所给的Linux 命令,而不询问用户是否需要执行该命令。
             {}表示命令的参数即为所找到的文件;命令的末尾必须以“ \;”结束。

寻找条件:
    -a    与
    -o    或
    !     非

    寻找条件可以是一个用逻辑运算符 not、and、or 组成的复合条件
and:逻辑与,在命令中用 -a 表示,是系统缺省的选项,表示只有当所给的条件都满足时,寻找条件才算满足
    find . -name 'tmp' -a -type c -a -user 'inin'

or:逻辑或,在命令中用 -o 表示。该运算符表示只要所给的条件中有一个满足时,寻找条件就算满足OPTIONS:描述命令所有的参数或选项
    find . -name 'tmp' -o -name 'mina*'

not:逻辑非,在命令中用 ! 表示。该运算符表示查找不满足所给条件的文件
    find . ! -name 'tmp'

grep        查找文件内容命令

grep [选项] 要查找的内容 查找的位置
选项:
    -A    除了显示符合范本样式的那一列之外,并显示该行之后的内容。
    -B    除了显示符合样式的那一行之外,并显示该行之前的内容。
    -C    除了显示符合样式的那一行之外,并显示该行之前后的内容。
    -i    忽略字符大小写的差别。
    -r    查找位置是目录时用。
    -n    在显示符合样式的那一行之前,标示出该行的列数编号。

which

whereis

3、解压缩文件 tar

tar

tar命令主要用于将若干文件或目录合并为一个文件,以便备份和压缩。
语法格式:
tar  [ -t | -x | -r | -c | -v | -f | -j | -z ]  tarfile  filelist
    -t	显示归档文件的内容
	-x	释放归档文件
	-c	创建一个新的归档文件
    -r  追加的方式归档文件
	-v	显示归档和释放的过程信息
	-f	用户指定归档文件的文件名,否则使用默认名称
	-j	由tar生成归档,然后由bzip2压缩
	-z	由tar生成归档,然后由gzip压缩
示例:
    tar -cvf file1.tar file1
    创建归档文件,显示归档过程信息,压缩后为file.tar
    
    tar -xvf file.tar
    解压缩文件,显示解压过程信息,操作file.tar文件

三、进程相关shell命令

1、ps

语法
ps [options]

常用语法:
    ps -elf
    ps -aux


-e: 显示所有进程。
-l: 使用长格式显示进程信息。这会提供比默认格式更多的列。
-f: 使用完整的格式显示进程信息。
    这包括UID(用户ID)、PID(进程ID)、PPID(父进程ID)、C(CPU利用率)、
    STIME(开始时间)、TTY(控制终端)、TIME(CPU时间)、CMD(启动命令)等字段。

-a: 显示所有用户的进程,而不仅仅是当前用户的进程。
-u: 显示进程的详细用户信息。
-x: 显示没有控制终端的进程。



2、top

监视进程:
    通常会全屏显示,而且会随着进程状态的变化不断更新
    整个系统的信息也会显示,为查找问题提供了便利
    可以显示系统总共有多少CPU和内存资源以及负载平衡等信息。  

3、pstree

    将所有行程以树状图显示, 树状图将会以 pid (如果有指定) 
或是以init这个基本进程为根,如果有指定使用者id, 则树状图会只显示该使用者所拥有的进程。 

4、发送信号 kill

使用kill命令终止进程:

    kill  [-signal]  PID 
        signal是信号
        PID是进程号
示例:
    kill -9 PID
    结束PID这个进程

    kill -l(小L)
    查看可以发送哪些信号  

5、用户管理

1、用户属性:
    用户名
    口令
    用户ID(UID)
    用户主目录(HOME)
    用户shell

2、/etc/passwd文件:
    /etc/passwd文件是系统能够识别的用户清单,用户登陆时,系统查询这个文件,确定用户的UID并验证用户口令
    登陆名
    经过加密的口令
    UID
    默认的GID
    个人信息
    主目录
    登陆shell

3、/etc/group文件
    包含了UNIX组的名称和每个组中成员列表,每一行代表一个组,包括4个字段
    组名
    加密的口令
    GID号
    成员列表,彼此用逗号隔开

4、添加用户
语法:adduser  <username>
示例: 
    #adduser newuser    --添加用户名为newuser的新用户

5、设置初始口令
语法:passwd [-k][-l][-u][-f][-d][-S] username
示例:passwd u
    passwd可以修改用户命令
    root用户可以修改任何用户的命令

6、设置用户属性
语法:usermod [-u uid [-o]] [-g group] [-G gropup,…]
              [-d home [-m]] [-s shell] [-c comment]
              [-l new_name] [-f inactive][-e expire]
              [-p passwd] [-L|-U] name

举例用户oldname改名为newname,注意要同时更改家目录: 
usermod –d /home/newname –m    –l newname    oldname

7、删除用户
语法:deluser  <username>
示例:deluser  --remove-home  user1			
         删除用户user1的同时删除用户的工作目录

四、shell脚本

1、概述

    Shell脚本是利用shell的功能所写的一个程序。
    这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能

2、执行方式

新建.sh文件    --shell脚本
vi test.sh

文件内容:
#!/bin/bash
echo "hello world"

执行方式:
bash test.sh
source test.sh
./test.sh

输出结果:
hello world

3、shell脚本变量

变量:
    变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
    变量可以通过变量名访问。在指令式语言中,变量通常是可变的。

变量作用:
    用来存放系统和用户需要使用的特定参数(值)
    变量名:使用固定的名称,由系统预设或用户定义
    变量值:能够根据用户设置、系统环境的变化而变化

命名规则:

变量分类:

用户自定义变量

1、在shell编程中通常使用全大写变量,方便识别 
    $ COUNT=1    #注意:'='两边不允许加空格

2、变量的调用:在变量前加$ 
    $ echo $COUNT
    1

3、Linux Shell/bash从右向左赋值
    $ Y=y
    $ X=$Y
    $ echo $X 
    y 

4、使用unset命令删除变量的赋值 
    $ Z=hello 
    $ echo $Z 
    hello 
    $ unset Z 
    $ echo $Z
 
5、取值
    双引号: 允许通过$符号引用其他变量值
        弱引用,其中的变量引用会被替换为变量值
    单引号: 禁止引用其他变量值,$视为普通字符
        强引用,其中的变量引用不会被替换为变量值,而保持源字符串
    反撇号: 命令替换,提取命令执行后的输出结果,``和$(…)作用相同
    示例:
    echo "$COUNT"
    echo '$COUNT'
    A=$(echo $COUNT)
    A=`echo $COUNT`    #命令替换,提取出echo的输出结果,赋给变量A
    1
    $COUNT
    1
    1

6、数组
    echo $a                       默认显示数组a的第一个元素
    echo ${a[0]}                  显示数组中第一个元素,以此类推
    echo ${a[-1]}                 显示数组中最后一个元素
    echo ${a[*]}、echo ${a[@]}    显示数组中所有元素
    echo ${#a[@]}                 显示数组中元素的个数
    echo ${a[@]:起始元素id:元素个数]} 
                  显示数组中以起始元素为首的指定个数的元素(注意:这里起始元素id不能为负值
    unset a[n]    删除数组中的第n个元素
    unset a       删除a这个数组
    示例:
    a=(1 2 3 4 5)
    echo $a          #第一个元素    1
    echo ${a[*]}     #所有元素      1 2 3 4 5
    echo ${a[@]}     #所有元素      1 2 3 4 5
    echo ${#a[@]}    #元素个数      5
    echo ${a[2]}     #下标为2的元素 3
    echo ${a[@]:1:3} #打印下标为1-3的数据元素 2 3 4

    unset a[2]       #删除下标为2的元素后:
    echo ${#a[@]}    #元素个数    4
    echo ${a[*]}     #所有元素    1 2 4 5

7、只读变量
    变量值不允许修改(重新赋值)的情况
    无法使用 unset删除
    最快方法重启
    readonly
示例:
    readonly COUNT=3
    #COUNT=5            #只读变量不能被改变
    #unset COUNT        #只读变量的赋值不能被删除
    echo COUNT    



8、位置变量、预定义变量
    $0    与键入的命令行一样,包含脚本文件名
    $1,$2,……$9 ${10}    分别包含第一个到第十个命令行参数
    $#    包含命令行参数的个数
    $@    包含所有命令行参数:“$1,$2,……$9”
    $*    包含所有命令行参数,是一个整体:“$1,$2,……$9”
    $?    包含前一个命令的退出状态
    $$    包含正在执行进程的ID号
示例:
    echo $0
    echo $1
    echo $2
    ./test.sh 1 2 3    #输出:./test.sh 1 2
    echo $#            #输出:3,命令行参数个数
    echo $@            #输出:1 2 3 
    echo $*            #输出:1 2 3
    echo $?
    echo $$            #2970  进程ID

9、环境变量
    $USER 表示用户名称
    $HOME 表示用户的宿主目录
    $LANG 表示语言和字符集
    $PWD  表示当前所在工作目录
    $PATH 表示可执行用户程序的默认路径
    export可以将变量指定为全局变量
示例:
    echo $PATH    #输出路径
    echo $USER    #输出用户

4、shell语句

1、shell程序
    Shell 程序由零或多条shell语句构成。 shell语句包括三类:
        说明性语句
        功能性语句
        结构性语句

2、说明性语句(注释行)
    以#号开始到该行结束,不被解释执行,注释行可以出现在程序中的任何位置,既可以单独占用一行,也可以接在执行语句的后面。
以#号开始到所在行的行尾部分,都不被解释执行. 例如:
    #! /bin/sh 
    # 
    # 本程序说明
    #
    command_1 
    command_2                  # command_2的语句说明
    ……
    # 下面程序段的说明
    command_m
    ……
    command_n                  # command_n语句的说明
    ……

3、功能性语句(命令)
read:
    read从标准输入读入一行, 并赋值给后面的变量,其语法为:
        read  var    --把读入的数据全部赋给var
        read  var1  var2  var3    --把读入行中的第一个单词(word)赋给var1, 
                                  --第二个单词赋给var2, ……把其余所有的词赋给最后一个变量。
    如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行。
常用选项:
    -s 输入不回显
    -t 指定输入的时间
    -p 指定输入的提示字符串
示例:
read -s -t 3 -p "please input two num:"
echo "val1 = $val1"
echo "val2 = $val2"

expr:
    算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。
示例:
    $ expr 12 + 5 \* 3
    27

    $ expr 3 - 8 / 2
    -1

    $ num = 9
    $ sum=`expr $num \* 6 `    #要用取值符号``
    $ echo $sum
    54

test语句可测试三种对象:
    字符串    整数    文件属性
    每种测试对象都有若干测试操作符

字符串测试:
    s1 = s2   	测试两个字符串的内容是否完全一样
    s1 != s2	测试两个字符串的内容是否有差异
    -z s1 	    测试s1 字符串的长度是否为0
    -n s1 	    测试s1 字符串的长度是否不为0
示例:
    val1="hello"
    val2="hello"
    val3="hell"
    val4=
    test "$val1" = "$val2"    #条件为真,输出0
    echo $?
    test "$val1" != "$val3"   #条件为真,输出0
    echo $?
    test -z "$val4"           #条件为真,输出0
    echo $?
    test -n "$val1"           #条件为真,输出0
    echo $?

整数测试:
    a -eq b 	测试a 与b 是否相等
    a -ne b		测试a 与b 是否不相等
    a -gt b 	测试a 是否大于b
    a -ge b 	测试a 是否大于等于b
    a -lt b 	测试a 是否小于b
    a -le b 	测试a 是否小于等于b
示例:
    val1=3
    val2=5
    test $val1 -eq $val2
    echo $?                #条件为假,输出1
    test $val1 -lt $val2
    echo $?                #条件为真,输出0

文件测试:
    -e name    测试一个文件是否存在
    -d name    测试name 是否为一个目录
    -f name    测试name 是否为普通文件
    -L name    测试name 是否为符号链接
    -r name    测试name 文件是否存在且为可读
    -w name    测试name 文件是否存在且为可写
    -x name    测试name 文件是否存在且为可执行
    -s name    测试name 文件是否存在且其长度不为0
    f1 -nt f2  测试文件f1 是否比文件f2 更新
    f1 -ot f2  测试文件f1 是否比文件f2 更旧
示例:
    test -f read.sh
    echo $?            #是普通文件,条件为真,输出0

4、结构性语句
    结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。
    主要包括:
        条件测试语句(两路分支)
        多路分支语句
        循环语句
        循环控制语句等
(1)分支语句
分支语句:

语法结构:
    if 表达式
        then 命令表
    fi    
    如果表达式为真,则执行命令表中的命令;否则退出if语句, 即执行fi后面的语句。 
    if和fi是条件语句的语句括号,必须成对使用;命令表中的命令可以是一条,也可以是若干条。
示例1:
    read -p "input a filename:" file    #判断是文件还是文件夹
    if [ -f $file ]
    then
        echo "$file is a file"
    elif [ -d $file ]
    then
        echo "$file is a dir"
    else
        echo "$file is not a dir or file"
    fi

示例2:
#判断用户是否存在,存在打印exist,不存在打印not exist
#^linux是正则表达式,即开头是linux
#wc -l统计文本行数,行数为1,说明找到了linux这个用户
#``是命令置换
    #!/bin/bash        
    RET=`grep "^linux" /etc/passwd | wc -l`
    if [ $RET -eq 1 ]
    then
        echo "exist"
    else
        echo "not exist"
    fi
    

语法结构:
    if 表达式
        then 命令表1
    else 命令表2
    fi
    **如果表达式为真,则执行命令表1中的命令,再退出if语句;否则执行命令表2中的语句, 再退出if语句。
    **注意: 无论表达式是否为真,都有语句要执行。
示例:
    read -p "input a filename:" file
    if [ -e $file ]
    then
        echo "$file exist"
    else
        echo "$file is not exist"
    fi


多路分支语句:

语法结构:
case 字符串变量 in
    模式1)
        命令表1
        ;;
    模式2 | 模式3)   
        命令表2
        ;;
     ……
    模式n)
        命令表n
        ;;
esac
**多路分支语句case用于多重条件测试,语法结构清晰自然。
示例1:
#!/bin/bash
read -p "input yes/no" val

case $val in             #判断输入是yes还是no
    yes | y)
        echo "input yes"
        ;;
    YES | Y)
        echo "input YES"
        ;;
    no)
        echo "input no"
        ;;                #最后一个模式的双分号;;可以省略,前面不行
esac

示例2:
#学生成绩分级管理
#80-100 A
#60-79  B
#0-59   C

#-a     与
#-o     或
#!      非

#!/bin/bash                
read -p "input score" val

if [ $val gt 100 -o $val lt 0]      #shell下的判断方式-o
#if [ $val gt 100 ] || [ $val lt 0]   #c下的判断方式||
then
    echo "input error val"
    exit
fi

val=`expr $val / 10`
case $val in
    8 | 9 | 10)
        echo "A"
        ;;
    6 | 7)
        echo "B"
        ;;
    *)
        echo "C"
        ;;
esac
(2)循环语句
for:
当循环次数已知或确定时,使用for循环语句来多次执行一条或一组命令。格式为:                
    for 变量名 in 单词表
    do
        命令表
    done
    <1>变量依次取单词表中的各个单词,每取一次单词,就执行一次循环体中的命令。
    <2>循环次数由单词表中的单词数确定,命令表中的命令可以是一条,也可以是由分号或换行符分开的多条。
    <3>如果单词表是命令行上的所有位置参数时,可以在for语句中省略 “in 单词表” 部分。
示例1:
#!/bin/bash
filename=`ls`
for file in $filename        #循环判断ls列出来的名字是否是文件
do
    if [ -f $file ]
    then
        echo "$file is a file"
    else
        echo "$file is not a file"
done

示例2:
#!/bin/bash            #假设运行:./for.sh 1 2 3
#for file in "$@"      #$@会输出 1 2 3    #表明这样是当作一个整体输出
for file in "$*"       #$*会输出 1        #表明这样是一个一个的输出
do                               2
    echo "$file"                 3
done

示例3:
#!/bin/bash
for ((i = 0; i < 5; i = i+1))    #c语言形式的for循环,运行时会循环打印i的值
do                               #注意:是(())双括号
    echo "$i"
done



while:
while 命令或表达式
    do
        命令表
    done
    <1>while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,
然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
    <2>while语句的退出状态为命令表中被执行的最后一条命令的退出状态。
示例:
#!/bin/bash            #循环打印0 1 2 3 4
i=0
#while [ $i -lt 5 ]    #[]中括号形式条件判断
while ((i < 5))        #也可以用c语言下的条件判断,注意要(())双括号
do
    echo "$i"
    i=`expr $i + 1`
done



循环控制语句:
break、continue
    break n     跳出n层;  
    continue    语句则马上转到最近一层循环语句的下一轮循环上
    continue n  转到最近n层循环语句的下一轮循环上
示例:
#!/bin/bash
i=0
while ((i < 5))
do
    echo "$i"
    if [ $i -eq 3]
    then
        break        #break跳出本层循环
        #continue    #continue跳出本次循环
    fi
    i=`expr $i + 1`
done
#continue会跳出一次do循环,i加到3以后就会进入if条件判断,碰到continue就会跳出这次do循环,
#结果就是i的值一直会保持为3,打印完0 1 2后,一直打印3

#break会跳出一层do循环,i加到3以后就会进入if条件判断,碰到break后就会跳出do循环
#结果就是i的值为3时,就退出循环,仅会打印出0 1 2 3

5、函数

1、函数定义

基本语法:
function name() {
    statements
    [return value]
}
    function是 Shell 中的关键字,专门用来定义函数
    name是函数名
    statements是函数要执行的代码,也就是一组语句
    return value表示函数的返回值,其中return是Shell关键字,专门用在函数中返回一个值,这一部分可以写也可以不写。
示例:
fun.sh:

#*********************文件全部内容
#!/bin/bash
function fun(){
    echo "hello world"
    return 0
}
fun
#*********************

运行:
./fun.sh
hello world


2、函数调用

格式1:
    value_name = `function_name [arg1 arg2...]`
    #函数的所有标准输出都传递给了主程序的变量
格式2:
    function_name [arg1 arg2...]
    echo $?                        
    #获取函数的返回的状态
示例:
fun.sh:
#*********************文件全部内容
#!/bin/bash
function fun(){
    echo "hello world"
    return 1
}
fun        
echo $?        #调用格式:获取函数的返回状态
#*********************
运行:
./fun.sh
hello world
1


fun.sh
#*********************文件全部内容
#!/bin/bash
function fun(){
    echo "hello world"
    grep "$1" /etc/passwd
    echo $2
    echo $3
    echo $4
    return 0
}

ret=`fun linux 1 5 8`    #命令置换:是把标准输出的内容赋值给ret
echo "***$ret"           #调用格式:所有标准输出都传递给了主程序的变量
#*********************

运行:
./fun.sh
***hello world
linux:x:1000:1000:linux,,,:/home/linux:/bin/bash
1
5
8


3、变量作用域
    全局作用域:在脚本的其他任何地方都能够访问该变量。默认是全局变量
    局部作用域:只能在声明变量的作用域内访问。
    声明局部变量的格式:
        local   variable_name =value

示例1:fun.sh

#!/bin/bash
function fun(){
    val=100        #这里的变量默认是全局变量,函数外也能使用,想要变成局部变量,要加local
    echo $val
    return 1
}
fun
echo "***$val1"

运行:./fun.sh
100
***100


示例2:fun.sh

#!/bin/bash
function fun(){
    local val=100        #加local后,变量变为局部变量,局部变量在函数外不能使用了
    echo $val
    return 1
}
fun
echo "***$val1"

运行:./fun.sh
100
***

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值