shell中的变量及函数

本文深入探讨了Shell脚本中的变量类型及其应用,包括环境级、用户级和系统级变量的定义与区别,并通过实例展示了如何利用这些变量执行脚本、设定路径及创建用户等操作。同时介绍了函数在Shell脚本中的作用,以及如何通过函数实现代码复用和功能模块化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

############################1.变量###########################################

########简介:

   (1)什么是变量?

        变量即在程序运行过程中它的值是允许改变的量,变量是用一串固定的字符来标志不固定的值的一种方法,变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储scripts运行时可更改的程序信息。在shell 中变量是不可能永久保存在系统中的,必须在文件中声明。

                     

    (2)都有哪些变量?


        在shell中变量分为环境级变量,用户级变量,系统级变量, 环境级变量只在当前shell中生效,shell关闭变量丢失, 用户级变量写在用户的骨文件中,只针对当前用户有效, 系统级变量被写在系统的配置文件/etc/profile中 ,变量即在程序运行时保存在内存中。 硬盘永久,内存临时的。

       用户级的变量(相对于系统级文件后被加载) 在./profile中定义 
       系统级的变量 在/etc/profile中定义 

       环境级的变量 a=1 export a=1 

       变量名称的规范:

                    

########各种级别下的变量

(1)环境级:     export A=1 

      

(2)用户级:     vim ~/.bash_profile 

                                 添加:export A=1

                                  

                                  

                                   //查看不到变量的值是因为在不同的shell环境,新的shell会加载不同的配置文件覆盖原来的

(3)系统级:       vim /etc/profile 

                                  添加:export A=1                                               

                                  

                                  

                                        所有用户都可以共享变量资源。

实战演练

eg:实现用相对路径执行脚本(这是临时的,如果重启,设定会失效)

[root@desktop ~]# echo $PATH   //查看环境变量
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@desktop ~]# ls /mnt/*
/mnt/file  /mnt/install_apache.sh  /mnt/passwd
[root@desktop ~]# chmod +x /mnt/*
[root@desktop ~]# install_apache.sh  11 //不能执行
bash: install_apache.sh: command not found...
[root@desktop ~]# PATH=$PATH:/mnt  //修改路径
[root@desktop ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/mnt
[root@desktop ~]# install_apache.sh  12  //可以执行
the Listen is changed 
[root@desktop ~]# exit  //退出连接
logout
Connection to 172.25.254.169 closed.
[kiosk@foundation69 Desktop]$ ssh root@172.25.254.169 -X  //重新连接
root@172.25.254.169's password: 
Last login: Sun Jun 17 04:52:04 2018 from 172.25.254.69
[root@desktop ~]# chmod +x /mnt/*
[root@desktop ~]# install_apache.sh  //不能执行
bash: install_apache.sh: command not found...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

########环境变量的设定方式

“”是弱引用,批量转译,不能转义”!”,”\”,”`”,”$” 

\代表单个字符,相当于” 
”是强引用,批量转译 
$()变量声明,和“没有区别 
$[]等同于(()) 
${}系统声明 
echo 1+1 显示结果为1+1,其中1+1是可变长字符 
echo $[1+1] 显示结果为2,是整形字符

                      

                     

                      

                      

                      

###########变量值传递

    $0       脚本的名字
    $1       脚本后的第一串字符串
    $2       脚本后的第二串字符串
    $3       脚本后的第三串字符串
    $#       脚本后所跟字符的个数
    $*       脚本后跟的所有字符串,模式如“1 2 3 ……”
    $@       脚本后跟的所有字符串,模式如“1” “2” “3” ……
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

eg:vim  file.sh 

                                   这里写图片描述 

                        

                         

eg:      $*和$@的区别(脚本示例):

[root@desktop ~]# vim for.sh
    #!/bin/bash
    for name in "$@"
    do
        echo "$name"
    done
[root@desktop ~]# sh -x for.sh 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

                     

[root@desktop ~]# vim for.sh
    #!/bin/bash
    for name in "$*"
    do
        echo "$name"
    done
[root@desktop ~]# sh -x for.sh 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

                     


##########read交互式传参

read -s NAME                                  //-s 表示加密,输入的时候看不到输入的字符 
read -p “input:” NAME                     //-p 打印

                         

                         


                          

    #!/bin/bash
    read -p "please input a number:" -s IP(-p 后跟提示内容  -s 表示不显示输入的内容)
    echo " "
    ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down

                         

                          


         eg:交互式设定用户文件和密码文件建立用户。

vim /mnt/create_user.sh
    #!/bin/bash
    read -p "please input userfile:" USERFILE
    [ ! -e $USERFILE ]&&{
    echo "\033[32mERROR:$USERFILE is not exist!!\033[0m"
    exit 1
    }
    read -p "please input passfile:" PASSFILE
    [ ! -e $PASSFILE ]&&{
    echo "\033[32mERROR:$PASSFILE is not exist!!\033[0m"
    exit 1
    }

    MAX_LINE=`awk 'BEGIN{N=0}{N++}{print N}' $USERFILE`       //利用数据报告生成器计算userfile的行数;
    for NUM in `seq 1 $MAX_Line`  //变量NUM从1循环到最大值
    do
        USERNAME=`sed -n ${NUM}p $USERFILE`  //利用sed对文件userfle进行逐行提取
        PASSWORD=`sed -n ${NUM}p $PASSFILE`   
        useradd $USERNAME  //建立用户
        echo $PASSWORD | passwd --stdin $USERNAME  //修改密码
    done 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

                           

      

                           

###########命令别名的设定

   alias xie='vim'       shell 环境变量
   vim .bashrc
    alias xie='vim'      用户变量
   source .bashrc
   vim /etc/bashrc
    alias xie='vim'      系统变量
   source /etc/bashrc
   删除文件中写的内容
   unalias xie           撤销别名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

1)临时设定: 
alias xie=’vim’ //设定vim的别名,即输入xie即可打开vim的功能 

如果exit断开连接,那么临时设定失效,下次登陆,xie命令不能识别; 



       
2)永久生效: 
(用户级) 
vim ~/.bashrc 
alias xie=’vim’ 
source ~/.bashrc //刷新 
alias //查看,是否有设置的别名; 
但是,这种是在root的家目录下设置的,只对root用户生效;如果切换至student用户,那么xie命令不能识别; 


(系统级)
vim /etc/bashrc
     alias xie='vim'
source /etc/bashrc
alias       
  • 1
  • 2
  • 3
  • 4

这种方式,是在系统的配置文件修改的,对所有可以登陆系统的用户都生效;如,切换至student用户,xie命令也是生效的;

3)unalias xie; //撤销命令的别名: 

因为虽然把文件信息删除之后,内存中还会存在别名设定的信息,所以刷新之后还会有alias xie存在;

#######利用命令执行结果设定变量

$? 是命令在执行完之后产生的退出值,范围为[0-255] 
当$0=0,时表示命令执行没有错误输出,这个值可以用ecit 命令执行。

echo $? //查看退出值(0-255) 
0 正确 
1 命令执行的错误 
2 方法不正确

示例 1: 
利用echo $?返回退出值来判断是否ip 可以ping通;

[root@desktop mnt]# vim /mnt/ip_check.sh
    #!/bin/bash
    ping -c1 -w1 $1 &> /dev/dull
    NUM=`echo $?`
    [ "$NUM" == "0" ]&&{
        echo " $1 is up! "
        exit 1
    }||{
        echo " $1 is down!"
        exit 1
    }
[root@desktop mnt]# sh /mnt/ip_check.sh 172.25.254.74
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 112
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

######################2.函数##########################################

函数的优点: 
1)循环执行; 
2)简化脚本内容; 
3)可读性更高;

示例 1: 
要求:执行脚本回车,提示动作,输入add,建立用户,回车,输入密码;输入del,删除用户;如果输入exit;退出;

vim /mnt/create_user.sh
    #!/bin/bash
    ACTION_ADD()
    {
            [ "$1" == add ] && {
                    read -p "please input a username: " USERNAME
                    read -p "please input a password: " -s PASSWORD
                    useradd $USERNAME
                    echo  -e "\033[31mthe users has created successfully!\033[0m"
                    echo $PASSWORD | passwd --stdin $USERNAME
            }
    }
    ACTION_DEL()
    {
            [ "$1" == del ] && {
                    read -p "please input a username: " USERNAME
                    userdel -r $USERNAME
                    echo -e "\033[31m the user has deleted!\033[0m"
            }
    }
    USER_CTL()
    {
            read -p "please input action(add or del): " ACTION
            [ "$ACTION" == exit ] && {
                    echo -e "\033[31mbye\033[0m"
                    exit 0
            }
            ACTION_ADD $ACTION
            ACTION_DEL $ACTION
            USER_CTL
    }
    USER_CTL
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32


示例 2: 
实现对主机ip的网络ping检测循环不间断,直至输入exit才会退出; 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值