bash预定义变量和read命令-59

本文介绍了Bash中的预定义变量,如用于检查命令状态的$?、获取当前和后台进程ID的$$和$!,以及read命令用于接收键盘输入的方法。

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

bash预定义变量和read命令

        前面讲过位置参数变量,而我们也说过位置参数变量就是预定义变量的一种,用法和功能都和预定义变量相同。
        那么下面就来分别讲一下剩下的几个预定义变量。

        一、预定义变量
            1、$?:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;而如果这个变量的值非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确。

            我们来举例说明:
            [root@localhost ~]# ls
            这条命令是正确的,那么我们用$?检测的结果肯定是0
            [root@localhost ~]# echo $?

            [root@localhost ~]# lsdda
            这条命令是错误的,系统找不到这个命令,那用$?检测返回的值就不是0了
            [root@localhost ~]# echo $?
            他会返回127,这个127其实就是错误序号,是预先定义好的值,一旦出现找不到命令的错误就会返回127.

            [root@localhost ~]# ls jlajlj
            这个命令也是错误的,没有这个目录,返回的错误呢是2,也就是找不到目录的错误序号就是2。

            如图:
            预定义参数变量$?

            这个预定义变量用的还是比较多的。制作一些无人职守的脚本的时候会用到。
            就比如我们前面学习逻辑与&&和逻辑或||符号的时候,比如:
            [root@localhost ~]# ls fagd && echo yes || echo no
            也就是如果ls fagd命令正确就输出yes,否则输出no,靠什么判断正确与否啊,其实就是靠$?变量。

            2、$$:当前进程的进程号(PID)

            3、$!:后台运行的最后一个进程的进程号(PID)
                大家只要记住只要是在计算机里运行的任何一个程序都至少有一个id号,计算机根据这个id号来确定是某个进程。

            那么$$和$!的区别就是一个显示当前进程id一个显示后台运行的最后一个进程id。

            我们举例说明:
            首先说明一下当前进程就是我们正在执行的进程,什么是后台进程呢,就是我们把一个程序不让他在shell界面显示,而是转入计算机的后台运行。和我们windows的后台进程是一个道理,比如把某个软件最小化,就转到后台运行了。
            [root@localhost ~]# vim ceshi3.sh
            #!/bin/bash

            echo $$

            #让一个程序在后台运行,就在程序的最后加一个&符号,就转入后台执行了。
            find /root -name hello.sh&

            echo $!

            上面这个脚本的意思就是执行这个脚本的时候,脚本先返回我们当前执行脚本的进程号,然后执行在后台搜素hello.sh,然后返回后台运行的这个进程号。
            好的,我们来执行一下,如图:
            预定义变量$$和 $!
            是不是返回一个2277,一个2278,也就是一个前台进程ID,一个后台进程ID。
            然后把第二个搜索命令的结果给我们返回到shell界面。

            而如果我们的ceshi3.sh的脚本里的find命令不用&转入后台运行符号结尾的话,我们执行这个脚本就会输出当前进程号和搜索的结果,而不是显示两个进程号。
            大家自己试试就明白了。

            这就是$$和$!的区别。这两个变量不怎么常用。能理解就可以了。

    二、接收键盘输入
        1、[root@localhost ~]# read [选项][变量名]
        选项:
            -p”提示信息”:在等待read输入时,输出提示信息
            -t秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
            -n字符数:read命令只接受指定的字符数,就会执行
            -s:隐藏输入的数据,适用于机密信息的输入。

        我们前面学习位置参数变量$n的时候就说过,用$1,$2…这种变量,当给他们传参的时候只有写脚本的人知道怎么进行传递,而其他人根本就不知道怎么回事,因为没有任何提示,我们不建议,也提到过会用其他更直观的方法进行传参,那就是我们现在要学习的这个read命令,这个命令比如加-p选项的时候,等待read的时候就会提示我们应该输入什么类型的内容,这样就方便多了。

        2、我们来举个例子来说明:
        我们还是来写一个脚本程序:
        #!/bin/bash
        # Author:mageo (E-mail:services@mageo.cn)
        read -t 30 -p “Please input your name:” name
        #提示”请输入姓名”并等待30秒,把用户的输入值保存入变量name中,也就是传参给name。

        echo “Name is $name”
        #打印用户输出的名字。
        #####################################################

        read -s -t 30 -p “Please enter your age:” age
        #年龄隐藏输入,我们就用-s选项来隐藏。
        echo -e “\n”
        #”\n”是换行符,表示另起一行显示
        echo “Age is $age”
        #####################################################
        read -n 1 -t 30 -p “Please select your gender[M/F]:” gender
        #使用’-n 1’选项代表只接受一个输入字符选择性别后就会执行,不用回车。
        echo -e “\n”
        echo “Sex is $gender”

        第一段脚本等待我们30秒让我们输入名字,
        第二段脚本等待我们30秒让我们输入年龄,而且输入的时候会隐藏字符。
        第三段脚本等待我们30秒,我们只需要输入一个字符M或F就直接执行。

        如图:
       键盘接收输入read命令
        大家把上面脚本写完赋予执行权限后执行一下试试就知道了,非常有意思的。
        仔细看是不是在输入年龄的那行并没有显示你输入的内容啊,因为-s隐藏了。

        其中-p和-t都是必须要添加的选项。
        那么用read命令就比用位置参数变量$1,$2,$3…传参的方式方便多了。

    本教程原创作者:mageo,出自每集博客,尊重作者劳动,转载请注明出处:http://www.ql2015.cn,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值