免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 308648 | 回复: 217

[系统管理] Linux基础命令 [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2018-12-10 14:43:45
发表于 2018-10-16 15:35 |显示全部楼层

Arch
     Arch指令主要用于显示当前主机的硬件结构类型,我们可以看到它输出的结果有:i386、i486、mips、alpha等。此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。

1、语法
    arch  [选项]

2、选项列表
    --help   
        显示此命令的帮助信息
    --version
        显示命令的版本信息

3、实例

点击(此处)折叠或打开

  • [root@localhost ntop-4.0.1]# arch
  • i686 //可以看到当前是32位的i686机器
  • [root@localhost ntop-4.0.1]# arch --help
  • 用法:arch [选项]...
  • 输出机器的体系结构。
  • --help        显示此帮助信息并退出
  • --version        显示版本信息并退出
  • 请向bug-coreutils@gnu.org 报告arch 的错误
  • GNU coreutils 项目主页:
  • GNU 软件一般性帮助:
  • 请向 报告arch 的翻译错误
  • 要获取完整文档,请运行:info coreutils 'arch invocation'
  • [root@localhost ntop-4.0.1]# arch --version
  • arch (GNU coreutils) 8.4
  • Copyright (C) 2010 Free Software Foundation, Inc.
  • 许可证:GPLv3+:GNU 通用公共许可证第3 版或更新版本。
  • 本软件是自由软件:您可以自由修改和重新发布它。
  • 在法律范围内没有其他保证。
  • 由David MacKenzie 和Karel Zak 编写。
  • [root@localhost ntop-4.0.1]#




lspci
    lspci是一种实用程序,用于在系统中显示有关pci总线的信息以及连接到它们的设备。
    默认情况下,它显示了一个简单的设备列表。使用下面描述的选项可以请求更详细的输出或其他程序用于解析的输出。
    如果要报告PCI设备驱动程序或lspci本身中的bug,请使用选项“lspci-vvx”或更好的“lspci-vvxxx”的输出(不过,可能会有警告)。
    输出的某些部分,特别是在高度冗长的模式下,只有经验丰富的PCI黑客才能理解Proba-Bly。有关字段的确切定义,请参阅PCI规范或head er.h和/usr/include/linux/pci.h文件。
    在许多操作系统上,对PCI配置空间的某些部分的访问仅限于root用户,因此对于普通用户来说,lspci的功能是有限的。然而,lspci尽力显示尽可能多的可用信息,并将所有其他信息标记为<访问拒绝>文本
    该命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。

1、语法
    lspci  [选项]
    lspci命令中,我们经常会看到一些“[]:[].[]”这样格式的数字,例如“00:01.0”,这一个参数是总线编号,第二个是插槽编号,第三个是功能编号,它们都是十六进制的数字。

2、选项列表
    1)基础显示模式
    -m
        以向后兼容并且机器可读的方式转储设备信息
    -mm
        以机器可读的方式转储设备信息,以便脚本解析
    -t
        以树形结构显示pci设备的层次关系,包含所有总线、桥梁、设备和它们之间的连接
    2)显示选项
    -n
        显示pci设备的厂商和设备代码
    -v
        显示所有设备的详细信息
    -vv
        以更加详细的方式显示设备信息
    -k
        显示处理每个设备的内核驱动程序以及能够处理该设备的内核模块。默认情况下,当-v以正常的输出模式打开时。(目前只在内核2.6或更高版本的Linux上工作。)
    -x
        显示配置空间标准部分的十六进制转储(CardBus桥的前64字节或128字节)。
    -xxx
        显示整个PCI配置空间的十六进制转储。当您试图读取配置空间的某些部分时,只有当几个PCI设备崩溃时,它才可用,而且只适合root用户。(这种行为可能没有违反PCI标准,但至少非常愚蠢)。然而,这样的设备很少见,所以您不必太担心
    -xxxx
        显示扩展(4096字节)PCI配置空间在PCI-X2.0和PCIExpress总线上可用的十六进制转储
    -b
        以总线为中心的视图。显示由pci总线上的卡看到的所有irq编号和地址。注意,不是有内核看到的
    -D
        始终显示PCI域号。默认情况下,lspci在只有域0的机器上略过它们。
     3)解析ID为名称的选项
    -n
        将PCI供应商和设备代码显示为编号,而不是在PCI ID列表中查找它们。
    -nn
        显示pci供应商和设备的代码和名字
    -q
        如果在本地pci.id文件中找不到设备,则使用DNS查询中央PCI ID数据库。如果DNS查询成功,结果将缓存在~/.pciids-cache中,即使-q不再给出,也会在后续运行中识别。请在自动脚本中使用此开关时要小心,以避免数据库服务器超载。
    -qq
        和“-q”一样,但是本地缓存被重置
    -Q
        查询中央数据库,即使是本地也有缓存数据可查。如果您怀疑显示的条目是错误的,请使用此方法。
    4)选择设备的选项
    -s [域]:[总线]:[插槽].[功能]
        只显示指定域中的设备(如果您的计算机有几个主机桥接器,它们可以共享公共总线编号空间,或者每个设备可以自己寻址PCI域;域编号为0到ffff)、总线编号(0到ff)、插槽编号(0至1f)、函数编号(0至7)。地址可以省略或设置为“*”,这两者都意味着“任何值”。所有数字都是十六进制的。例如,“0:”表示总线0上的所有设备,“0”表示设备0在任何总线上的所有功能,“0.3”在所有总线上选择设备0的第三功能,“4”仅显示每个设备的第四个功能。
    -d [厂商:设备]
        显示指定厂商和设备的信息,厂商号和设备号都是十六进制。
    5)其他选项
    -i
        指定pci设备编号文件,默认文件是/usr/share/hwdata/pci.ids
    -p
        使用指定文件作为PCI ID的映射文件,默认使用/lib/Module/kernel_version/Modes.pcimap
    -M
        调用总线映射模式,它对所有pci设备,包括配置错误的桥后面的设备进行彻底扫描。此选项只在直接硬件访问模式下提供有意义的结果,通常需要根权限。请注意,总线映射程序只扫描pci域0。
    6)PCI设备访问选项
    -A
        库支持多种方法来访问PCI硬件。默认情况下,它使用第一个可用的访问方法,但您可以使用此选项覆盖此决定。你可以使用“-A help”来先看可用的方法
    -O =
        库的行为由多个命名参数控制。此选项允许设置任何参数的值。使用“-Ohelp“获取已知参数及其默认值的列表。
    -H1
        通过Intel配置机制1直接访问硬件
    -H2
        通过Intel配置机制2直接访问硬件
    -F
        与其访问真正的硬件,不如从先前运行的lspci-x生成的给定文件中读取设备及其配置寄存器的值列表,这对于分析用户提供的错误报告非常有用,因为您可以任何方式显示硬件配置,而不需要使用更多转储请求来干扰用户。
    -G
        提高库的调试级别

3、关于选项的说明
    1)关于“–m”选项
    如果您打算自动处理lspci的输出,请使用本节中描述的机器可读的输出格式之一(-m、-vm、-vmm)。所有其他格式都可能在lspci的不同版本之间发生变化。所有的数字都是以十六进制打印的。如果要处理数字ID而不是名称,请添加-n开关.
在简单格式中,每个设备都在一行上进行描述,这些参数被格式化为适合传递给shell脚本的参数,即由空格分隔的值,必要时引用和转义。其中一些参数是位置:槽、类、供应商名称、设备名称、子系统名称和子系统名称(如果设备没有子系统,最后两个参数是空的);其余的参数是选项
    2)关于“-vmm”选项
    详细的输出是由空行分隔的记录序列,每条记录用一行来描述一个设备,每一行包含一个‘tag:value’对。标记和值由单个制表符分隔。记录或记录中的行都不按任何特定顺序排列。标记区分大小写。下面是已经定义的tag:
    Slot,设备所在的插槽名称
    Class,类名
    Vendor,厂商名
    Device,设备名
    SVendor,子系统供应商名字
    SDevice,子设备名字
    PhySlot,设备所在的物理插槽
    Rev,修序号
    ProgIf,编程接口
    Driver,当前正在处理设备的内核驱动程序
    Module,内核模块的报告

4、实例
    1)以机器可读的方式显示

点击(此处)折叠或打开

  • [root@localhost ntop-4.0.1]# lspci -m
  • 00:00.0 "Host bridge" "Intel Corporation" "440FX - 82441FX PMC [Natoma]" -r02 "" ""
  • 00:01.0 "ISA bridge" "Intel Corporation" "82371SB PIIX3 ISA [Natoma/Triton II]" "" ""
  • 00:01.1 "IDE interface" "Intel Corporation" "82371AB/EB/MB PIIX4 IDE" -r01 -p8a "" ""
  • 00:02.0 "VGA compatible controller" "InnoTek Systemberatung GmbH" "VirtualBox Graphics Adapter" "" ""


    2)显示设备代码和名字

点击(此处)折叠或打开

  • [root@localhost ntop-4.0.1]# lspci –nn
  • //设备代码0600, 厂商代码8086:1237
  • 00:00.0 Host bridge [0600: Intel Corporation 440FX - 82441FX PMC [Natoma [8086:1237 (rev 02)
  • 00:01.0 ISA bridge [0601: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II [8086:7000
  • 00:01.1 IDE interface [0101: Intel Corporation 82371AB/EB/MB PIIX4 IDE [8086:7111 (rev 01)


    3)以树形结构显示

点击(此处)折叠或打开

  • [root@localhost ntop-4.0.1]# lspci –t
  • //总线编号,插槽,功能编号
  • -[0000:00-+-00.0
  •            +-01.0
  •            +-01.1
  •            +-02.0


    4)显示指定位置的设备信息

点击(此处)折叠或打开

  • [root@localhost ntop-4.0.1]# lspci -s 0000:01.0
  • 00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II


    5)显示指定厂商和设备号的设备信息

点击(此处)折叠或打开

  • [root@localhost ntop-4.0.1]# lspci -d 8086:1237
  • 00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma (rev 02)




论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2018-12-10 14:43:45
发表于 2018-10-16 20:22 |显示全部楼层

lsusb
       显示本机的usb设备列表,可以显示出usb的详细信息,包括设备的读取速度和描述符。此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。
1、语法
       lsusb  [选项]

2、选项列表

选项

说明

-v

告诉lsusb详细显示所示设备的详细信息。这包括设备当前速度的配置描述符。如果可用,类描述符将显示USB设备类,包括集线器、音频、HID、通信和芯片卡。

-s [[bus]:][devnum]

显示指定总线和设备号的设备信息,总线和设备号用十进制标识。格式:lsusb –s 00:01

-d [vendor]:[product]

显示指定厂商和产品编号的设备,用十六进制表示编号。格式:lsusb –d 8086:

-D

显示指定设备文件的设备信息,例如:lsusb –D /proc/bus/usb/001/001。只有
root用户才可以使用这个选项

-t

以树状结构显示

-V

指令版本信息


      如果指定的设备没有被找到,那么返回一个非0值。/usr/share/hwdata/usb.ids文件中记录了所有的USB设备节点的信息,包括制造商、产品号、类、子类、协议等等。

3、实例

        1)直接显示简单的设备信息

[root@localhost ntop-4.0.1]# lsusb

//总线号      设备号          厂商ID

Bus 001      Device 001:   ID 1d6b:0001 Linux Foundation 1.1 root hub

        2)显示详细信息

[root@localhost ntop-4.0.1]# lsusb -v

Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Device Descriptor:      //设备描述符

  bLength                18

  bDescriptorType         1

  …

Hub Descriptor:         //集线器描述符

  bLength              11

Hub Port Status:       //集线器端口状态

   Port 1: 0000.0100 power

   Port 2: 0000.0100 power

  …

Device Status:     0x0003   //设备状态

  Self Powered

  Remote Wakeup Enabled

3)显示指定总线上的设备

[root@localhost ntop-4.0.1]# lsusb -s 001:001

Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

4)显示指定厂商的设备信息

[root@localhost ntop-4.0.1]# lsusb -d 1d6b:001

Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

5)以树状结构显示

[root@localhost ntop-4.0.1]# lsusb -t

Bus#  1

`-Dev#   1 Vendor 0x1d6b Product 0x0001



论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2018-12-10 14:43:45
发表于 2018-10-17 07:00 |显示全部楼层
本帖最后由 一生有你llx 于 2018-10-17 07:04 编辑

eject

eject指令允许在软件控制下弹出可移动媒体(通常是光盘、软盘、磁带或Jaz或ZIP磁盘)。该命令还可以控制一些由某些设备支持的自动弹出功能的多光盘转换器,并关闭一些光盘驱动器的盘。

    对应于的name的设备被弹出。名称可以是一个设备文件或挂载点,可以是一个完整的路径,也可以是前面省略的“/dev”、“/media”或“/mnt”。如果未指定名称,则使用默认名称“cdrom”。

    根据设备是CD ROM、SCSI设备、可移动软盘还是磁带,有四种不同的弹出方法。默认情况下,弹出将按顺序尝试所有四种方法,直到成功为止。如果该设备目前已安装,则在弹出前将其卸载。

    此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。

1、语法
     
eject [-vnrsfmqp]  []
   
eject [-vn]  -a  on|off|1|0 []
   
eject [-vn]  -i  on|off|1|0 []   
   
eject [-vn]  -T  []
   
eject [-vn]  -X  []
   

2、选项列表

选项

说明

-h | --help

显示简单的帮助文档

-V | --version

显示命令版本信息,然后退出

-v | --verbose

执行指令的时候显示详细信息,可以在命令行看到指令在干什么

-d | --default

显示默认的设备名字(cdrom)

-a on|1|off|0

这个选项控制自动弹出模式,只有某些设备才支持。如果是能这个开关,设备在关闭的时候会自动弹出。

-c

使用此选项,可以从ATAPI/IDE CD-ROM转换器中选择CD插槽。使用此特性需要Linux2.0或更高版本。当一个更改请求工作的时候,无法使用CD-ROM驱动器(挂载的数据CD或播放音乐CD)。还请注意,转换器的第一个插槽称为0,而不是1。

-i on|1|off|0

此选项可以锁定弹出按钮,使其不工作。当启用时,当按下按钮时,驱动器将不会弹出。这是有用的,当您携带笔记本电脑在一个袋子或箱子,不希望它弹出,如果该按钮是无意中按下。

-t | --trayclose

有了这个选项,驱动器被赋予一个CD-ROM托盘关闭命令。并非所有设备都支持此命令。

-T | --traytoggle

如果CD-ROM托盘已经打开,那么它将关闭;如果CD-ROM托盘已经关闭,那么它将弹出。并非所有设备都支持此命令,因为它使用了上面的CD-ROM托盘关闭命令。

-x | --cdspeed

使用此选项,CDROM驱动器可以进行选择速度。速度参数是一个指示所需速度的数字(例如,8表示8X速度),或0表示最大数据速率。并非所有设备都支持此命令,而且您只能指定驱动器能够达到的速度。每次媒体更改时,此选项将被清除。此选项可以单独使用,也可以与-t和-c选项一起使用。

-X | --listspeed

显示cdrom的可用速度。使用此选项,将探测CD-ROM驱动器以检测可用的速度。输出一个速度列表,可用作-x选项的参数。这只适用于Linux2.6.13或更高版本,在以前的版本上只报告最高速度。还请注意,某些驱动器可能无法正确报告速度,因此选项不适用于它们。

-n | --noop

显示所选的设备,但是不执行任何操作

-r | --cdrom

弹出 cdrom设备

-s | --scsi

弹出SCSI设备

-f | --floppy

弹出 floppy设备

-q | --tape

弹出 磁带设备

-p | --proc

允许使用/proc/mounts代替/etc/mtab

-m | --no-umount

此选项允许eject与自动挂载可移动媒体的设备驱动程序一起工作,因此这些设备必须总是已挂载的。该选项告诉eject不要尝试卸载给定的设备,即使它是根据/etc/mtab或/proc/挂载安装的。

3、example

功能

指令

弹出默认设备

eject

弹出一个名字为cdrom的设备或者挂载点

eject cdrom

使用设备名来弹出

eject /dev/cdrom

使用挂载点弹出

eject /mnt/cdrom

弹出第4个IDE设备

eject hdd

弹出第一个SCSI设备

eject sda

使用SCSI分区名称弹出

eject sda4

在多盘交换机上选择第5盘

eject –v –c4 /dev/cdrom

打开声音放映机CD-ROM上的自动弹出功能

eject –a on /dev/sbpcd

4、说明

     eject指令执行成功之后会返回0,如果失败就返回1。

    eject指令只适用于支持四种弹出方法中的一种或多种方法的设备。这包括大多数光盘驱动器(IDE、SCSI和专有)、一些SCSI磁带驱动器、Jaz驱动器、ZIP驱动器(并行口、SCSI和IDE版本)和LS 120可移动软盘。用户还报告说,在Sun SPARC和Apple Macintosh系统上,软盘驱动器也取得了成功。如果弹出无法工作,很可能是对设备的内核驱动程序的限制,而不是弹出程序本身的限制。

    -r、-s、-f和-q选项允许控制用于弹出的方法。可以指定多个方法。如果没有指定这些选项,则会尝试所有四个选项(在大多数情况下,这很好)。

    eject并不总是能够确定设备是否已安装(例如,它是否有多个名称)。如果设备名称是一个符号链接,弹出将跟随该链接并使用它所指向的设备。

    如果eject确定该设备可以具有多个分区,则它将尝试在弹出之前卸载该设备的所有已安装分区。如果卸载失败,程序将不会尝试弹出媒体。

    你可以弹出一张音频CD。如果驱动器是空的,一些CDROM将拒绝打开托盘。有些设备不支持托盘关闭命令。

    如果启用了自动弹出功能,则在运行此命令后,驱动器将始终弹出。并不是所有的linux内核CDROM驱动程序都支持自动弹出模式,无法找到自动弹出模式的状态。

    您需要适当的权限才能访问设备文件。要弹出某些设备(例如SCSI设备),需要以root或setuidroot的形式运行。

    用于查找设备的启发式方法(给定名称)如下所示。如果名称以尾随斜杠结尾,则删除它(这是为了支持使用shell文件名完成生成的文件名)。如果名称以“.”或“/”开头,则尝试将其作为设备文件或挂载点打开。如果失败,它会尝试将‘/dev/’、‘/media/’、‘/mnt/’、‘/dev/cdroms’、‘/dev/rdsk/’、‘/dev/dsk/’和最后‘./’放在名称前面,直到找到可以打开的设备文件或挂载点。安装设备的程序检查/etc/mtab。如果失败,它还会检查/etc/fSTAB以查找当前未挂载设备的挂载点。

    建议创建符号链接,如/dev/cdrom或/dev/zip,以便eject可以使用容易记住的名称来确定合适的设备。

    要保存类型,可以为特定设置工作的弹出选项创建shell别名。

5、实例

     1)没有指定设备类型,直接弹出cdrom。此种情况下会依次尝试所有的方式,直到弹出为止。

[root@localhost ~]# eject v     //使用-v来显示指令执行的过程

eject: using default device `cdrom'

eject: device name is `cdrom'

eject: expanded name is `/dev/cdrom'

eject: `/dev/cdrom' is a link to `/dev/sr0'

eject: `/dev/sr0' is not mounted

eject: `/dev/sr0' is not a mount point

eject: checking if device "/dev/sr0" has a removable or hotpluggable flag

eject: `/dev/sr0' is not a multipartition device

eject: trying to eject `/dev/sr0' using CD-ROM eject command //尝试第一种弹出方式

eject: CD-ROM eject command failed

eject: trying to eject `/dev/sr0' using SCSI commands   //尝试第二种弹出方式

eject: SCSI eject succeeded

     2)使用“-r”选项,弹出cdrom

[root@localhost ~]# mount    //查看是否有光盘挂载

/dev/mapper/VolGroup-lv_root on / type ext4 (rw)

/dev/sr0 on /media/VBox_GAs_5.2.16 type iso9660 (ro,nosuid,nodev,uhelper=udisks,uid=0,gid=0,iocharset=utf8,mode=0400,dmode=0500)

[root@localhost ~]# eject -v r    //弹出光盘

eject: using default device `cdrom'

eject: trying to eject `/dev/sr0' using CD-ROM eject command

eject: CD-ROM eject command succeeded

论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2018-12-10 14:43:45
发表于 2018-10-17 20:44 |显示全部楼层
本帖最后由 一生有你llx 于 2019-01-11 07:02 编辑

做了一个Linux学习的平台,目前出来一个雏形,各位可以参考使用
链接:https://pan.baidu.com/s/1GOLVU2CbpBNGtunztVpaCQ  密码:n7bk

4.gif


论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2018-12-10 14:43:45
发表于 2018-10-17 20:48 |显示全部楼层
本帖最后由 一生有你llx 于 2018-10-17 20:52 编辑

hwclock  

    hwclock是一种访问硬件时钟的工具,可以显示当前时间,将硬件时钟设置为指定的时间,将硬件时钟设置为系统时间,以及从硬件时钟设置系统时间。您还可以定期运行hwlock以插入或删除硬件时钟中的时间,以补偿系统漂移(如果继续运行,则该时钟始终以一定的速率获得或丢失时间)。

    该命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。

1、语法

    hwclock  [functions]  [options]

2、选项列表


选项

说明

-u | --utc | --localtime

指示硬件时钟分别保持在协调的世界时间或本地时间。您可以选择是否将时钟保持在协调世界协调时或本地时间,但时钟中没有显示任何信息。这是你所选择的,所以这个选项就是你如何将信息提供给时钟。

如果您指定了这些选项中的一个错误的(或者没有指定,并且选择了错误的默认值),那么硬件时钟的设置和查询都将被搞砸。

如果您没有指定-utc或-localtime,则默认值以最后一次使用hwlock设置时钟时指定的值为准(即,hwlock成功地使用-set、-system ohc或-调整器选项运行),如adjtime文件中所记录的。如果adjtime文件不存在,则默认值为本地时间。

--noadjfile

禁用/etc/adjtime.hwlock提供的工具,不使用此选项读取或写入该文件。在使用此选项时,必须指定-UTC和--localtime

--adjfile=ilename

覆盖默认的/etc/adjtime文件

-f | --rtc=filename

重写默认/dev文件名,在许多平台上为/dev/rtc,但可能是/dev/rtc0、/dev/rtc1,等等。

--directisa

只有在ISA机器或Alpha上才有意义(粗略地说,它实现了足够多的ISA机器来实现hwlock的目的)。对于其他机器,它没有作用。这个选项告诉hwlock使用显式I/O指令来访问硬件时钟。如果没有这个选项,hwlock就会尝试。若要使用/dev/rtc设备(假定它由RTC设备驱动程序驱动),如果它无法打开设备(用于读取),它将使用显式I/O指令。

--badyear

表示硬件时钟无法存储超出1994-1999年范围的年份。在一些BIOSes(几乎所有在4/26/94至5/31/95之间制造的BIOSes)中都存在一个问题,在这些BIOSes中,它们无法处理1999年之后的年份。如果试图将世纪价值设置为小于94(或95 in)的值。在某些情况下,实际设置的值为94(或95),因此,如果您有这些机器中的一台,则hwlock不能在1999年之后设置,也不能以正常的方式使用时钟的值作为真正的时间。

为了弥补这一点(没有BIOS更新,这肯定更好),请始终使用-如果您有这些机器中的一台,就使用-坏年份。在adjtime文件中假设日期是过去一年内的日期。要想让它发挥作用,你最好每年至少运行一次hwclock --set或hwlock –systohc。

虽然hwlock在读取硬件时钟时忽略了年份值,但当它设置时钟时,它会设置年份值,将其设置为1995、1996、1997或1998,无论哪个年份在闰年周期中所处的位置与真正的年份相同。这样,硬件时钟就会插入。如果你让硬件时钟在没有设置的情况下运行一年以上,这个方案可能会失败,最后你可能会损失一天。

--srm

此选项等价于--epoch=1900,用于使用srm控制台指定alphad上最常见的历元。

--arc

此选项等价于--epoch=1980,用于使用ARC控制台指定ALPHS上最常见的历次(但Ruffans有1900年)。

--jensen | --funky-toy

这两个选项指定了您拥有的Alpha机器的类型。如果您没有Alpha,则它们是无效的,如果有,它们通常是不必要的,因为hwlock应该能够自行确定运行在什么上,至少在安装/proc时是这样的。(如果您发现您需要这些选项之一使hwlock工作,请与维护人员联系,看看程序是否可以改进以自动检测您的系统。‘hwlock --debug’和‘cat/proc/cpuinfo’的输出可能会引起人们的兴趣。)

--jensen代表运行在Jensen模式。

--funky-toy意味着在您的机器上,必须使用UF位而不是硬件时钟中的UIP位来检测时间转换。选项名中的“toy”是指机器一年中的时间

--test

测试程序,不改变任何设置

--debug

显示大量关于hwlock内部正在做什么的信息,其中一些功能是复杂的,这个输出可以帮助您理解程序是如何工作的。

3、说明

    一般在操作系统中都会有两个时钟,硬件时钟是主板上的定时器时钟,系统时钟是系统的内核时钟,它们相互不影响。

    1)硬件时钟

    这个时钟,运行独立于任何控制程序运行在CPU中,甚至当机器关闭。在ISA系统中,这个时钟被指定为ISA标准的一部分。控制程序可以读取或设置这个时钟为整秒,但控制程序也可以检测1秒时钟的边缘,因此该时钟实际上具有无限的精度。

    这种时钟通常被称为硬件时钟、实时时钟、RTC、BIOS时钟和CMOS时钟。硬件时钟以其大写的形式被hwlock所发明,因为其他所有的名称都不适合误导。例如,一些非ISA系统有几个实时时钟。一个非常低功耗的I2C或SPI时钟芯片可以与备用电池一起作为硬件时钟,以初始化一个功能更好的集成实时时钟,用于大多数其他用途。

    2)系统时钟

    这是由Linux内核内的时钟保持的时间,由计时器中断驱动。(在ISA机器上,计时器中断是ISA标准的一部分)。它只有在linux在机器上运行时才有意义。系统时间是从1970年世界协调时(UTC)1月1日00:00开始的秒数(或者更简洁地说,是1969年以来的秒数)。不过,系统时间不是整数,它实际上是无限的。系统时间是重要的时间。Linux系统中硬件时钟的基本目的是在Linux不运行时保持时间。在Linux启动时,将系统时间从硬件时钟初始化,然后不再使用硬件时钟。请注意,在设计ISA的DOS中,硬件时钟是唯一的实时时钟。

    重要的是,当系统运行时,系统时间不存在任何不连续性,比如使用date命令来设置它。但是,在系统运行时,您可以对硬件时钟做任何您想做的事情,而下一次Linux启动时,它将使用硬件时钟的调整时间进行设置。

    Linux内核维护系统的本地时区的概念。但是不要被误导-几乎没有人关心内核认为它在哪个时区。相反,关心时区的程序(可能因为他们想为您显示本地时间)几乎总是使用更传统的方法。确定时区:它们使用“tz”环境变量或“/usr/share/zoneinfo”目录,如tzset(3)的手册页所解释的那样。时区值是错误的,vFAT文件系统会在文件上报告并设置错误的时间戳。

    当您使用”--hctosys”选项设置系统时间时,hwlock将内核时区设置为“tz”或“/usr/share/zoneinfo”所指示的值。

    时区值实际上由两部分组成:1)字段“tz_minutesWest”表示本地时间(未根据DST进行调整)滞后于UTC;2)字段“tz_dsttime”,指示当前在本地有效的夏令时(DST)约定的类型。第二个字段不在Linux下使用,始终为零。

    3)hwclock如何访问硬件时钟

    hwlock使用多种不同的方法来获取和设置硬件时钟值,最常见的方法是对设备特殊文件“/dev/rtc”执行I/O操作,假定该文件是由rtc设备驱动程序驱动的。然而,这种方法并不总是可用的。首先,rtc驱动程序是linux中比较新的一种。此外,虽然有一些版本的rtc驱动程序可以在decalpha上工作,但似乎有大量的alpha无法工作(常见的症状是时钟挂起)。此外,最近的linux系统对rtc有更多的通用支持,甚至支持不止一个的系统,所以您可能需要通过指定/dev/rtc 0或/dev/rtc 1来覆盖默认值。

    在旧系统中,访问硬件时钟的方法取决于系统硬件。

    在ISA系统中,hwlock通过对端口0x70和0x71进行I/O操作,可以直接访问构成时钟的“CMOS存储器”寄存器。它使用实际的I/O指令,因此只有在超级用户有效用户ID的情况下才能这样做。(对于jensen Alpha,hwlock无法执行这些I/O指令,因此它使用设备文件“/dev/port”,它提供了与I/O子系统几乎一样低的接口)。这是一种非常糟糕的访问时钟的方法,因为用户空间程序通常不应该进行直接I/O和禁用中断。但是在ISA和Alpha系统中,这是唯一的方式。

    在m68k系统上,hwlock可以通过控制台驱动程序访问时钟,通过设备文件“/dev/tty1”访问时钟。

hwlock尝试使用文件“/dev/rtc”。如果内核没有编译“/dev/rtc”,或者它无法打开“/dev/rtc”,那么hwlock将返回到另一种方法(如果可用的话)。在ISA或Alpha计算机上,您可以强制hwclock使用CMOS寄存器的直接操作,而无需通过指定“--directisa”选项。

    4)校准功能adjust

    硬件时钟通常不是很精确,但是它的许多不准确是完全可以预测的,它每天得到或失去相同的时间。这被称为系统漂移。hwlock的“调整”功能允许您进行系统校正以纠正系统漂移。它的工作方式如下:hwlock保存了一个文件“/etc/adjtime”,它保存了一些历史信息。

    假设您从没有adjtime文件开始,发出hwlock-set命令将硬件时钟设置为真实的当前时间。hwlock创建adjtime文件,并在其中记录当前时间,作为最后一次校准时钟。5天后,时钟增加了10秒,因此您可以发出另一个“hwlock --set”命令来设置它。返回10秒。hwlock更新adjtime文件,显示当前时间作为最后一次校准时钟,并以系统漂移速率记录每天2秒。24小时过去,然后发出“hwlock --adjust”命令。hwlock查阅adjtime文件,看到时钟离开时每天增加2秒。一个人呆了整整一天。所以它从硬件时钟中减去2秒。然后,它记录当前时间作为最后一次调整时钟的时间。又过了24小时,你又发出了另一个“hwclock --adjust”指令。hwclock做了同样的事情:减去2秒,用当前时间更新adjtime文件,这是最后一次调整时钟。

每次您校准时钟(使用--set或—systohc)时,hwlock根据上次校准的时间、上次调整后的时间、在任何中间的调整中假定的漂移率以及时钟当前的关闭量,重新计算系统漂移率。在hwclock使用的任何时候,都会出现少量的误差,因此它不会进行小于1秒的调整。稍后,当您再次请求调整时,累积漂移将超过1秒钟,而hwlock则会进行调整。

    在系统启动时,在“hwlock --hctosys”之前进行hwlock的调整是很好的,并且在系统通过cron运行时也可以定期进行调整。

    虽然adjtime文件的命名仅仅是为了控制时间调整的历史记录,但它实际上包含了hwlock在从一个调用到下一个调用时记忆信息时使用的其他信息。adjtime文件的格式是ASCII:

        第1行的3个数字数字,用空格隔开,分别代表:a)系统漂移率,每天以秒为单位,浮点小数点;b)自1969年世界协调时以来最近调整或校准的秒数,小数整数;c)零(与时钟(兼容)为十进制整数。

        第2行一个数字,代表自1969年世界协调时以来最近一次校准产生的秒数。如果还没有校准,或者已知任何先前的校准都是没有意义的,那么值就是0(例如,因为在校准之后,硬件时钟已经被找到,不包含有效时间)。这是一个十进制整数。

        第3行是“utc”或“local”。指示硬件时钟是设置为协调世界时间还是设置为本地时间。

    5)内核如何自动同步硬件时钟

    在某些系统中,您应该注意到硬件时钟保持同步的另一种方式。Linux内核有一种模式,它每11分钟将系统时间复制一次到硬件时钟。这是一个很好的模式,当您使用一些复杂的东西,比如NTP来保持系统时间同步时。(NTP是一种保持系统时间同步的方法,它可以与网络上的某个时间服务器或连接到您的系统的无线电时钟保持同步。参见RFC 1305)。

    这个模式(我们称之为“11分钟模式”)是关闭的,直到有东西打开它。ntp守护进程xntpd就可以打开它。您可以通过运行任何东西来关闭它,包括“hwlock --hctosys”,它以老式的方式设置系统时间。

    如果你的系统以11分钟的模式运行,不要使用“hwlock --adjust”或“hwlock-hctosys”。在启动时使用“hwlock --hctosys”来获得一个合理的系统时间是可以接受的,直到您的系统能够运行为止。从外部源设置系统时间并启动11分钟模式

4、实例

1)不适用任何参数,直接查看硬件时钟

[root@localhost ntop-4.0.1]# hwclock

2018年08月23日 星期四 15时01分28秒  -0.577410 seconds

2)设置硬件时钟

[root@localhost ntop-4.0.1]# hwclock --set --date="0904"    //设置硬件时钟,需要date参数来配合使用

[root@localhost ntop-4.0.1]# hwclock

2018年09月04日 星期二 09时04分09秒  -0.479386 seconds

3)将硬件时钟设置成本地时间格式

[root@localhost ntop-4.0.1]# hwclock --localtime

2018年09月04日 星期二 01时05分46秒  -0.462990 seconds

4)将硬件时钟设置成系统时间

[root@localhost ntop-4.0.1]# date      //查看当前系统时间

2018年 09月 04日 星期二 12:25:15 CST

[root@localhost ntop-4.0.1]# hwclock –w  //将硬件时钟设置为系统时间

[root@localhost ntop-4.0.1]# hwclock     //查看硬件时钟

2018年09月04日 星期二 12时25分48秒  -0.263687 seconds

论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2018-12-10 14:43:45
发表于 2018-10-18 21:10 |显示全部楼层
du
  以块为单位,显示当前目录下,所有目录、文件、子目录的磁盘使用情况。总结每个文件的磁盘使用情况,对目录进行递归处理
  此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。

1、语法
  du [选项]  [目录]

2、选项列表
选项
说明
--help
帮助
--version
显示命令版本信息
-a | --all
显示所有的文件大小,包含目录、文件、子目录。默认情况下不显示文件的大小
--apparent-size
打印表观大小,而不是磁盘使用量;虽然表观大小通常较小,但由于(“稀疏”)文件中的漏洞、内部碎片、间接块等原因,它可能更大。
-B | --block-size=SIZE
设置显示时的块大小
-b | --bytes
等价于“--apparent-size --block-size=1”
-c | --total
产生一个总和统计
-D | --dereference-args | -H
只引用命令行中列出的符号链接
--files0-from=F
总结文件F中指定的以NUL结尾的文件名的磁盘使用情况;如果F是“-”,则从标准输入中读取名称
-h | --human-readable
以更加易读的方式来显示
--si
和“-h“一样,只是显示单位是1000,而不是1024
-k
相当于—block-size=1k
-m
相当于—block-size=1M
-l | --count-links
如果是硬链接,那么记录次数
-L | --dereference
取消引用所有符号链接
-P | --no-dereference
不要跟随任何符号链接,这是默认的
-0 | --null
以0字节(而不是换行符)结束每一行输出
-S | --separate-dirs
不包括子目录的大小
-s | --summarize
只显示每个参数的总数
-x | --one-file-system
跳过不同文件系统上的目录
-X | --exclude-from=FILE
排除与文件中任何模式匹配的文件
--exclude=PATTERN
排除匹配模式的文件
--max-depth=N
只有目录层数少于N,才打印目录(或文件)的总数(或带有-all);“--max-depth=0“等价于 ” --summarize “
--time
显示最后修改的时间
--time=WORD
将时间显示为指定的内容而不是修改时间,可以是:atime、access、use、ctime或status。
--time-style=STYLE
使用指定的格式显示时间,时间格式可以是full-iso,long-iso,iso,+FORMAT

  该指令显示的值的单位是“--block-size”、“DF_BLOCK_SIZE”、“BLOCK_SIZE”,、BLOCKSIZE”这是四个值中第一个可用的值。 除了第一个值是用户设定的,其他3个都是环境变量。如果这四个值没有可用的,那么默认是1024(如果设置了POSIXLY_CORRECT,那么就是512)。
  显示的单位可能是:KB,1000;K,1024;MB,100*100;M,1024*1024。

3、实例
  1)查看home目录总大小
[root@192 ~]# du /home -s
2320472    /home
  2)使用“--time”选项,显示最后的修改时间
[root@192 ~]# du /home --time
4   2010-11-12 08:54  /home/test01/.gnome2
4   2010-08-18 23:43  /home/test01/.mozilla/extensions
  3)使用“-m”选项,以Mb为单位显示
[root@192 ~]# du /home -m
1   /home/test01/.gnome2                //不够1M的,按照1M处理
1   /home/test01/.mozilla/extensions
  4)指定“--time“的显示
[root@localhost ~]# du /weijie/ --time=use              //最后使用时间
12  2018-10-08 09:11  /weijie/www.baidu.com
4   2018-10-08 09:11  /weijie/testftp
56  2018-10-13 08:40  /weijie/
[root@localhost ~]# du /weijie/ --time=status            //状态改变时间
12  2018-10-03 10:09  /weijie/www.baidu.com
4   2018-10-02 09:34  /weijie/testftp
56  2018-10-03 10:09  /weijie/



论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2018-12-10 14:43:45
发表于 2018-10-18 21:52 |显示全部楼层
df
    显示磁盘分区上的磁盘使用状况,可以显示出文件系统名称、大小、挂载点等信息。df显示包含每个文件名参数的文件系统上可用的磁盘空间。如果不给出文件名,则显示所有当前挂载的文件系统上可用的空间。默认情况下,磁盘空间显示在1K的块中,除非设置了环境变量POSIXLY_RIDER,在这种情况下使用512个字节块。
    如果参数是包含已挂载文件系统的磁盘设备节点的绝对文件名,df将显示该文件系统上的可用空间,而不是包含设备节点的文件系统(始终是根文件系统)。这样做的各种系统都需要非常不可移植的文件系统结构知识。
    此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。
1、语法
    df [OPTION]...  [FILE]...

2、选项列表
选项
说明
--help
帮助
--version
显示命令版本信息
-a | --all
显示所有的文件系统,包含虚拟文件系统
[文件]
显示指定文件所在的文件系统信息
-B | --block-size=SIZE
设置显示时的块大小
--direct
显示文件的统计信息,而不是挂载点
--total
产生一个总和
-h | --human-readable
以更加易读的方式来显示
-H | --si
以更加易读的方式显示,但是使用1000为一个单位,而不是1024
-i | --inodes
显示inode信息
-k
等价于”--block-size=1k”
-l | --local
显示本地文件系统
--no-sync
在获取使用信息之前,不**同步
--sync
在获取信息之前**同步
-P | --portability
使用POSIX输出格式
-t | --type=TYPE
显示指定类型的文件系统信息
-T | --print-type
显示文件系统类型
-x | --exclude-type=TYPE
不显示指定的文件系统

该指令显示的值的单位是“--block-size”、“DF_BLOCK_SIZE”、“BLOCK_SIZE”,、BLOCKSIZE”这是四个值中第一个可用的值。 除了第一个值是用户设定的,其他3个都是环境变量。如果这四个值没有可用的,那么默认是1024(如果设置了POSIXLY_CORRECT,那么就是512)。
显示的单位可能是:KB,1000;K,1024;MB,100*100;M,1024*1024。

3、实例
    1)使用“-h”选项,以方便阅读的方式显示文件系统信息
[root@localhost ~]# df h
//文件系统名字大小已用可用使用百分比挂载点
Filesystem                        Size    Used   Avail Use%        Mounted on
/dev/mapper/VolGroup-lv_root   25G     13G    11G    56%         /
tmpfs                               811M    292K  810M   1%          /dev/shm
/dev/sda1                          485M    33M    427M   8%          /boot
    2)使用“-T”选项,显示出文件系统的类型
[root@localhost ~]# df T
//文件系统名字类型大小已用可用使用百分比挂载点
Filesystem                       Type      1K-blocks    Used       Available Use% Mounted on
/dev/mapper/VolGroup-lv_root ext4      25552764     13364332  10890412   56%   /
tmpfs                             tmpfs     829656       292        829364     1%    /dev/shm
/dev/sda1                         ext4     495844       32996      437248     8%   /boot
    3)使用“-B”选项,指定显示时的块大小是2048kb。注意结果可以和上面对比一下
[root@localhost ~]# df B 2048
//文件系统名字类型大小已用可用使用百分比挂载点
Filesystem                       Type      2K-blocks    Used       Available Use% Mounted on
/dev/mapper/VolGroup-lv_root ext4      12776382    6682164    5445208     56%   /
tmpfs                             tmpfs     414828      146         414682      1%    /dev/shm
/dev/sda1                         ext4     247922       16498     218624       8%    /boot
    4)使用“-t”选项,指定显示“ext4”类型的文件系统信息
[root@localhost ~]# df t ext4
//文件系统名字类型大小已用可用使用百分比挂载点
/dev/mapper/VolGroup-lv_root ext4      25552764     13364332  10890412   56%   /
/dev/sda1                         ext4     495844       32996      437248     8%   /boot


论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2018-12-10 14:43:45
发表于 2018-10-19 20:00 |显示全部楼层

bc

bc是一种算数语言,其语法和c语言类似,可以交互执行。通过命令行选项可以获得一个标准的数学库。如果请求,在处理任何文件之前定义数学库。BC从处理所有文件的代码开始。命令行中列出的文件按所列顺序排列。在处理完所有文件后,BC从标准输入中读取。所有代码都在读取时执行。(如果文件包含停止处理器的命令,BC将永远不会从标准输入中读取。

此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。

1、语法

      bc  [ -hlwsqv ]  [long-options]  [  file ... ]

           

2、选项列表

选项

说明

-h | --help

帮助信息

-v | --version

显示命令版本信息

-l | --mathlib

定义标准数学库

-i | --interactive

强制交互

-w | --warn

显示POSIX的警告信息

-s | --standard

使用POSIX标准来处理

-q | --quiet

不显示欢迎信息

3、说明

1)数据

bc中最基本的元素是数字。数字是任意精度的数字。这种精度既包括整数部分,也包括分数部分。所有的数字在内部用十进制表示,所有的计算都用十进制来表示。(此版本截断除法和乘运算的结果。)数字有两个属性:长度和小数位。长度是数字中有效位的总数,小数位是小数点之后的的有效位数。例如,0.000001的长度是6,小数位是6;1935.000的长度是7,小数位是3。

2)变量

数字存储在两种类型的变量中,简单变量和数组。变量名称以字母开头,后面跟着任意数量的字母、数字和下划线。所有字母都必须小写。(全字母-数字名是扩展名。在POSIX bc中,所有名称都是一个小写字母。)变量的类型在上下文中是明确的,因为所有数组变量名称后面都会有方括号([])。

有四个特殊的变量:scale、ibase、obase和last。scale定义了一些操作在小数点之后是如何使用数字的,默认值是0。ibase和obase定义输入和输出数字的转换基。默认值都是基数10。last(扩展)是一个变量。它是最后打印的数字的值。所有这些变量可能都有分配给它们的值,以及表达式中使用的值。

3)注释

bc中的注释以字符“/*”开头,以字符“*/”结尾。注释可以从任何地方开始,并显示为输入中的单个空格。(这会导致注释分隔其他输入项。例如,在变量名的中间找不到注释。)注释包括注释开始和结束之间的任何新行(行尾)。

为了支持bc脚本的使用,添加了行注释作为扩展。行注释从“#”字符开始,继续到行的结束。行结束字符不是注释的一部分,而是正常处理的。

如果命令行上的任何文件无法打开,bc将报告该文件不可用并终止。

4、关于表达式

这些数字由表达式和语句操作。由于语言设计为交互式,所以语句和表达式会尽快执行。没有“主”程序,而是在遇到时执行代码。

一个简单的表达式只是一个常量。BC使用变量ibase指定的当前输入基将常量转换为内部十进制数。(函数中有一个例外。)ibase的有效值为2到16,将超出此范围之后,分配给ibase的值可能是2或16。输入数字可能包含字符0-9和A-F。(注:它们必须是大写字母,小写字母是变量名称。)无论ibase的值是多少,单数数字总是有该数字的值。(即A=10。)对于多位数字,bc将所有大于或等于ibase的输入数字更改为IBASE-1的值。这使得FFF始终输入的最大3位数。

完全表达式类似于许多其他高级语言。由于只有一种数字,所以没有混合类型的规则。相反,有关于表达式精度的规则。每个表达式都有一个精度。这是从原始数字的精度、所执行的操作以及在许多情况下变量scale的值导出的。变量scale的有效值为0到可由c语言整数表达的最大值。

在以下合法表达式的描述中,“expr”指的是一个完整的表达式,“var”指的是一个简单的或数组变量。除非特别提到,结果的精度是所涉及的表达式的最大精度。

普通表达式

说明

-expr

结果是对表达式的否定。

++var

变量增加1,而新值是表达式的结果

--var

变量减1,而新值是表达式的结果

var++

表达式的结果是变量的值,然后变量增加1

var--

表达式的结果是变量的值,然后变量减1

expr * expr

表达式的结果是这两个表达式的乘积

expr + expr

表达式的结果是这两个表达式的和

expr – expr

表达式的结果是这两个表达式的差

expr / expr

表达式的结果是这两个表达式的商。结果的精度是变量scale的值。

expr % expr

表达式的结果是“余数”

expr ^ expr

表达式的结果是n次方,第二个表达式必须是整数。如果指数是负数,那么结果的精度是scale

(expr)

强制对表达式进行计算

var = expr

变量就是表达式的值

var = expr

相当于“var=varexpr”,例如”var -= expr” 等价于“var=var-expr”


     

关系表达式

关系表达式是一种特殊的表达式,计算结果总是0或1。如果关系为真,则计算为1;如果关系为假,则结果是0.。这些表达式可能出现在任何合法表达式中。(POSIX bc要求关系表达式仅用于if、while和语句,并且只能在其中进行一次关系测试。)

expr1 < expr2

expr1 <= expr2

expr1 > expr2

expr1 >= expr2

expr1 == expr2

expr1 != expr2

expr1 && expr2

expr1 || expr2

!expr

     运算符的优先级如下,从上到下依次增加:

运算符

结合方式

||

左结合

&&

左结合

不结合

关系运算符

左结合

赋值运算符

右结合

+和-

左结合

*、/、%

左结合

^

右结合

一元运算符 -

不结合

++和--

不结合

选择此优先级是为了使符合POSIX的bc程序能够正确运行。这将导致关系运算符和逻辑运算符在与赋值表达式一起使用时有一些不寻常的行为。例如下面的表达式:

a = 3<5

大多数C程序员会假设这会将“3<5”(值1)的结果赋给变量“a”,这在bc中所做的是将值3赋给变量“a”,然后比较3到5。在使用关系运算符和逻辑运算符与赋值运算符时,最好使用括号。

在bc中还提供了一些特殊的表达式。这些表达式与用户定义的函数和标准函数有关。它们都以“名称(参数)”的形式出现。有几个标准函数:

1)length(expr),计算表达式结果的有效位数。

2)read(),Read函数(一个扩展)将从标准输入中读取一个数字,而不管该函数发生在何处。注意,这可能会导致标准输入中的数据和程序混合出现问题。这个函数的最佳使用是在一个已经编写好的程序中,这个程序需要用户输入,但绝不允许从用户输入程序代码。读函数的值是从标准输入中读取的数字,使用转换基的变量ibase的当前值。

       3)scale ( expr ),这个函数的值是expr表达式中小数点之后的位数。

4)sqrt ( expression ),函数的结果是表达式的开方值。

5、关于语句

     语句(在大多数代数语言中)提供表达式计算的顺序。在bc中,语句被“尽快”执行。执行发生在遇到的换行符的时候,并且有一个或多个完整的语句。由于这种立即执行,换行符在bc中非常重要。事实上,分号和换行符都用作语句分隔符。如果换行符放置不当,将导致语法错误。因为换行符是语句分隔符,所以可以使用反斜杠字符隐藏换行符。()在bc中显示为空格而不是新行。语句列表是由分号和换行符分隔的一系列语句。

     1)表达式

     这条语句做两件事之一。如果表达式以“<变量><赋值>.”开头,则被认为是赋值语句。如果表达式不是赋值语句,则计算表达式并将表达式打印到输出。在打印数字之后,将打印换行符。例如,“a=1”是一个赋值语句和“(a=1)”是一个具有内嵌赋值的表达式。输出基obase的有效值是2~BC_BASE_MAX。对于基数2至16,通常采用书写数字的方法。对于大于16的基数,bc使用多字符数字方法将每个较高的基数打印成以10为基数的数据。由于数字具有任意精度,一些数字可能无法在一条输出线上打印。这些长数字将被分割,以“\”作为一行上的最后一个字符,每行打印的最大字符数为70个。由于bc的交互性,打印一个数字会导致最后将打印值赋值给特殊变量“last”的副作用。这允许用户恢复打印的最后一个值,而不必重新键入打印数字的表达式。将last变量赋值为“最后一个值”是合法的,并将最后一个打印的值用指定的值覆盖。新赋值将保持不变,直到打印下一个数字或将另一个值分配给“last”为止。

     2)字符串

字符串被打印到输出。字符串以双引号开始,包含所有字符直到下一个双引号字符。所有字符都是字面意思,包括任何换行符。字符串后不打印换行符。

     3)打印列表

print语句(扩展)提供了另一种输出方法。“list”是由逗号分隔的字符串和表达式的列表。每个字符串或表达式都按列表的顺序打印。不打印终止换行符。表达式的将被计算出值,最后将其值打印并分配给变量“last”。打印语句中的字符串将打印到输出中,并可能包含特殊字符。特殊字符以反斜杠字符“\”开始。bc识别的特殊字符是“a”(警报或钟)、“b”(反斜杠)、“f”(表单提要)、“n”(换行符)、“r”(回车)、“q”(双引号)、“t”(制表符)和“\”(反斜杠)。反斜杠后面的任何其他字符都将被忽略。

     4)语句列表

     这是复合语句。它允许将多个语句组合在一起执行。

     5)if (表达式)  statement 1  [else statement 2]

     if语句根据表达式的值决定执行statement 1或statement 2。如果表达式为非零,则执行statement 1。如果存在statement 2,且表达式的值为0的时候执行statement 2。
     6)while ( expression )  statement

     while语句将在表达式为非零时执行语句。它在每次执行语句之前计算表达式。循环的终止是由零表达式值或break语句的执行引起的。

     7)for ( [expression1] ; [expression2] ; [expression3] )  statement

     for语句控制语句的重复执行。表达式1是在循环之前计算的。表达式2是在每次语句执行之前计算的。如果表达式2为非零,则计算语句;如果为零,则终止循环。每次执行语句后,计算表达式3。在重新计算表达式2之前,如果未找到表达式1或表达式3,则不会在计算值的点上对其进行任何计算。

     8)break

     break语句用来强制退出,通常用在for语句或者while语句中。

     9)continue

     continue语句用来结束本次循环。

     10)halt

     halt语句会导致bc程序退出。

     11)return

     函数返回0.

     12)return expr

     返回表达式的值。

     13)伪语句,这些语句不会执行,他们在编译的时候才会起作用。下面列出伪语句

           a)limits,打印由于bc版本而产生的限制

           b)quit,遇到quit指令的时候就会退出bc,无论它出现在什么地方。例如“if (0 == 1) quit”就会导致退出bc

           c)warranty,打印较长的授权通知



论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2018-12-10 14:43:45
发表于 2018-10-19 20:01 |显示全部楼层

6、函数

     1)函数

     bc中的函数总是计算一个值并将其返回给调用者。函数定义是“动态的”,在输入中遇到定义之前,函数是未定义的。然后使用该定义,直到遇到相同名称的另一个定义函数。然后,新定义取代旧的定义。函数定义方式如下:

           define name ( parameters ) { newline

            auto_list  statement_list }

函数的调用很简单“name(parameters)”。

     2)参数

     参数是数字或数组。在函数定义中,可以有0个或者多个参数,通过逗号分隔开。所有参数都是通过值参数调用的。数组是通过符号“name[]在参数定义中指定的。在函数调用中,实参是数字参数的完整表达式。相同的符号。数组的定义和传值使用相同的符号。命名数组通过值传递给函数。由于函数定义是动态的,因此在调用函数时会检查参数号和类型。参数数量或类型的不匹配都会导致运行时错误。对未定义函数的调用也会出现运行时错误。

     3)auto_list

“auto_list”是供“本地”使用的变量的可选列表。auto_list的语法(如果存在)是“autoname,…;”。(分号是可选的。)每个名称都是自动变量的名称。数组可以使用与参数相同的表示法来指定。这些变量的值在函数开始时被推入堆栈中。然后将变量初始化为零,并在函数的整个执行过程中使用。在函数退出时,这些变量被弹出,以便恢复这些变量的原始值(在函数调用时)。这些参数实际上是自动变量,它们被初始化为函数调用中提供的值。自动变量不同于传统局部变量,因为如果函数A调用函数B,B可以使用相同的名称访问函数A的自动变量,除非函数B调用它们为自动变量。由于自动变量和参数被推到堆栈上,bc支持递归函数。

     4)函数体

函数体是一系列bc语句的列表。同样,语句用分号或换行符分隔。返回语句导致函数的终止和值的返回。返回语句有两个版本。第一个形式“return”将值0返回给调用表达式。第二种形式“return (表达式)”计算表达式的值并将该值返回给调用表达式。在每个函数的末尾有一个隐含的“return (0)”。这允许一个函数终止并返回0,而不需要显式返回语句。

函数还会改变变量ibase的用法。函数体中的所有常量都将在函数调用时使用ibase的值进行转换。在函数执行过程中,ibase的更改将被忽略,但标准函数读取除外,后者将始终使用ibase的当前值来转换数字。

     当前版本的bc,在函数中添加了几个扩展。首先,定义的格式稍微放松了一些。标准要求开始大括号与定义关键字在同一行,所有其他部分必须在下面的行上。这个版本的bc将允许之前的任何数目的换行符。在函数的开头支撑之后,例如,下面的定义是合法的:

        define  d  (n)  { return  (2*n); }

       define  d  (n)

        { return  (2*n); }

     5)void类型

函数可以定义为void。空函数不返回值,因此可能不会在任何需要值的地方使用。空函数在输入行调用时不会产生任何输出。关键字void放在关键字定义和函数名称之间。例如,请考虑下面的例子

define  py (y)  { print "--->", y, "<---", "0; }

define  void  px (x)  { print "--->", x, "<---", "0; }

py(1)

--->1<---

0                   //由于py不是void,因此有默认返回值,因此这里打印了它的返回值,

px(1)

--->1<---           //px是void类型,最后不会打印返回值

此外,还为数组添加了按变量调用。为了申明一个数组变量,函数中的数组参数是这样定义的“*name[]” 。

7、数学库

     1)如果使用“-l”选项调用bc,则预加载一个数学库,并将默认精度设置为20。数学库中有一下的函数:
        s(x),计算x的正弦值,x是弧度值。
        c(x),计算x的余弦值,x是弧度值。
        a(x),计算x的反正切值,返回弧度。
        l(x),计算x的自然对数。   
        e(x),e的x次方。
        j(n,x),从n到x的阶数。

     2)例子

     下面的句子可以将“pi”的值赋值给shell变量pi

pi = $(echo  "scale=10; 4*a(1)"  |  bc  -l)

下面的句子就是数学库中e的次方定义方式

scale = 20

/* Uses the fact that e^x = (e^(x/2))^2

    When x is small enough, we use the series:

    e^x = 1 + x + x^2/2! + x^3/3! + ...

*/

define e(x) {

    auto  a, d, e, f, i, m, v, z

    /* Check the sign of x. */

    if (x<0) {

        m = 1

        x = -x

    }

    /* Precondition x. */

    z = scale;

    scale = 4 + z + .44*x;

    while (x > 1) {

        f += 1;

        x /= 2;

    }

    /* Initialize the variables. */

    v = 1+x

    a = x

    d = 1

    for (i=2; 1; i++) {

        e = (a *= x) / (d *= i)

        if (e == 0) {

            if (f>0) while (f--)  v = v*v;

            scale = z

            if (m) return (1/v);

        return (v/1);

        }

        v += e

    }

}

     下面的语句实现一个计算支票簿余额的简单程序

scale=2

print "\nCheck book program!\n"

print "  Remember, deposits are negative transactions.\n"

print "  Exit by a 0 transaction.\n\n"

print "Initial balance? "; bal = read()

bal /= 1

print "\n"

while (1) {

    "current balance = "; bal

    "transaction? "; trans = read()

    if (trans == 0) break;

    bal -= trans

    bal /= 1

}

quit

     下面的语句采用递归的方式计算x的阶乘

define f (x) {

    if (x <= 1) return (1);

    return (f(x-1) * x);

}

8、readline和libedit选项

     可以编译GNU bc(通过一个配置选项)来使用GNU readline输入编辑器库或bsd libedit库。这允许用户在将行发送到bc之前进行编辑。它还允许保存以前键入的行的历史记录。当选择此选项时,bc还有一个特殊变量。变量“history”是保留的历史记录行数。对于readline,值-1表示不限制历史记录的行数,0将禁用历史记录功能,默认值为100。

9、差别

这个版本的bc是从POSIX P 1003.2/D11草案中实现的,包含了与草案和传统实现相比的一些区别和扩展,它不是以传统的方式使bc(1)实现的,这个版本是一个解析和运行程序字节代码转换的单一进程。这里有一个“无文档”选项(-c),它导致程序将字节码输出到标准输出,而不是运行它。它主要用于调试解析器和准备数学库。差异的一个主要来源是扩展,下面列出一些差异和扩展:

     1)LANG环境变量,此版本在处理lang环境变量和从lc_开始的所有环境变量时不符合POSIX标准。

     2)名字,传统和POSIX bc都有用于函数、变量和数组的单字母名称。它们被扩展为以字母开头的多字符名称,可以包含字母、数字和下划线字符。

     3)字符串,字符串不允许包含NUL字符。POSIX表示所有字符都必须包含在字符串中。

     4)last,POSIX bc中没有last变量。

     5)比较,POSIX bc只允许在if语句、while语句和for语句的第二个表达式中进行比较。

     6)if语句,POSIX bc中if语句没有else。

     7)for语句,POIX bc中要求for语句中的3个表达式都必须具备。

     8)&&,||,!,POSIX bc中没有逻辑运算。

     9)read,POSIX bc没有read功能。

     10)打印语句,POSIX bc没有打印语句。

     11)continue语句,POSIX bc没有continue语句。

     12)return,POSIX bc要求return的表达式加括号。

     13)数组参数,POSIX bc不(目前)完全支持数组参数。POSIX语法允许函数定义中的数组,但没有提供将数组指定为实际参数的方法。(这很可能是语法上的疏忽。)传统的bc实现只通过值数组参数进行调用。

     14)函数,POSIX bc要求函数开头的大括号和define关键字在同一行,语句在下一行。

     15)=+, =-, =*, =/, =%, =^。POSIX bc不要求定义这些“旧样式”赋值操作符。此版本可能允许这些“旧样式”赋值。使用限制语句查看安装的版本是否支持它们。如果它确实支持“旧样式”赋值运算符,则“a=-1”语句将使a减少1,而不是将a设置为值-1。

     16)数字中的空格,bc的其他实现允许数字空格。例如,“x=1 3”将值13赋值给变量x。相同的语句将导致bc版本中的语法错误。

     17)错误和执行,在程序中发现语法和其他错误时,此实现与其他实现的代码不同。如果在函数定义中发现语法错误,则错误恢复机制将尝试查找语句的开头并继续解析函数。一旦在函数中发现语法错误,该函数将不可调用并变为未定义。交互执行代码中的语法错误将使当前执行块失效。执行块由在完整语句序列之后出现的行尾终止。例如

     a = 1

     b = 2

这个语句有两个执行块,而下面的语句

     {a = 1

     b = 2}

只有一个执行块。任何运行时错误都会终止当前的执行块,而警告则不会。

     18)中断,在交互会话期间,SIGINT信号(通常由终端上的“ctrl+c“生成)将导致当前执行块的执行中断。它将显示一个“运行时”错误,指示哪个功能被中断。在所有运行时结构被清除后,将打印一条消息通知用户bc准备好接收更多的输入。所有先前定义的函数都保留定义,所有非自动变量的值是中断点的值。在清理过程中,所有自动变量和函数参数都会被移除。对于一个非交互式会话,SIGINT信号将终止bc的整个运行。

10、限制

     下面列出当前bc程序的一些限制,有一些限制可能已经被用户修改过。

1)BC_BASE_MAX,最大输出基设置为999。最大输入基为16。

2)BC_DIM_MAX,这是当前分布的65535以内的任意限制,每个机器可能都不一样。

3)BC_SCALE_MAX,小数点前后的位数都由INT_MAX限制。

4)BC_STRING_MAX,字符串中的字符字数由INT_MAX限制。

5)exponent,指数运算中的指数值由LONG_MAX限制。

6)variable names,当前对每个简单变量、数组和函数名字的限制32767。

11、环境变量

     下面的环境变量由bc程序来控制

1)POSIXLY_CORRECT,和“-s”选项一样。

2)BC_ENV_ARGS,这是另一种获取bc参数的机制。格式与命令行参数相同。这些参数是先处理的,因此环境参数中列出的任何文件在任何命令行参数文件之前都会被处理。这允许用户设置“标准”选项和文件,以便在每次调用环境变量中的文件通常包含用户希望在每次运行bc时定义的函数定义。

3)BC_LINE_LENGTH,这应该是一个整数,指定数字输出行中的字符数。这包括用于长数字的反斜杠和换行符。,如果值是0,将禁用多行功能。此变量的任何其他值如果小于3,则将行长设置为70。

12、实例

     1)简单计算

[root@192 ~]# bc

bc 1.06.95      //欢迎语句

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.

This is free software with ABSOLUTELY NO WARRANTY.

For details type `warranty'.

12+23    //输入加法表达式,回车

35       //得到结果

100/25   //输入除法表达式,回车

4         //得到结果

quit     //退出指令

[root@192 ~]#

     2)执行for循环语句

for(i=0; i<3; i++){print "hello\n"}   //这是一个打印语句

hello

hello

hello

3)从文件读取内容并且执行bc

[root@localhost /]# cat test.c                 //查看文件的内容,里面全是bc语句

/*define 3 functions add,sub,mul*/

define add(x,y){

    return x+y;

}

define sub(x,y){

    return x-y;

}

define mul(x,y){

    return x*y;

}

/*for statement*/

for(i=0;i<3;i++){

    print "bc test ",i,"\n";

}

/*print statement*/

print "10+5=",add(10,5),"\n"

print "10-5=",sub(10,5),"\n"

print "10&5=",mul(10,5),"\n"

/*quit bc program*/

quit

[root@localhost /]# bc test.c                   //bc程序从文件获取到代码,然后执行

bc 1.06.95

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.

This is free software with ABSOLUTELY NO WARRANTY.

For details type `warranty'.

bc test 0

bc test 1

bc test 2

10+5=15

10-5=5

10&5=50




论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2018-12-10 14:43:45
发表于 2018-10-19 20:01 |显示全部楼层

6、函数

     1)函数

     bc中的函数总是计算一个值并将其返回给调用者。函数定义是“动态的”,在输入中遇到定义之前,函数是未定义的。然后使用该定义,直到遇到相同名称的另一个定义函数。然后,新定义取代旧的定义。函数定义方式如下:

           define name ( parameters ) { newline

            auto_list  statement_list }

函数的调用很简单“name(parameters)”。

     2)参数

     参数是数字或数组。在函数定义中,可以有0个或者多个参数,通过逗号分隔开。所有参数都是通过值参数调用的。数组是通过符号“name[]在参数定义中指定的。在函数调用中,实参是数字参数的完整表达式。相同的符号。数组的定义和传值使用相同的符号。命名数组通过值传递给函数。由于函数定义是动态的,因此在调用函数时会检查参数号和类型。参数数量或类型的不匹配都会导致运行时错误。对未定义函数的调用也会出现运行时错误。

     3)auto_list

“auto_list”是供“本地”使用的变量的可选列表。auto_list的语法(如果存在)是“autoname,…;”。(分号是可选的。)每个名称都是自动变量的名称。数组可以使用与参数相同的表示法来指定。这些变量的值在函数开始时被推入堆栈中。然后将变量初始化为零,并在函数的整个执行过程中使用。在函数退出时,这些变量被弹出,以便恢复这些变量的原始值(在函数调用时)。这些参数实际上是自动变量,它们被初始化为函数调用中提供的值。自动变量不同于传统局部变量,因为如果函数A调用函数B,B可以使用相同的名称访问函数A的自动变量,除非函数B调用它们为自动变量。由于自动变量和参数被推到堆栈上,bc支持递归函数。

     4)函数体

函数体是一系列bc语句的列表。同样,语句用分号或换行符分隔。返回语句导致函数的终止和值的返回。返回语句有两个版本。第一个形式“return”将值0返回给调用表达式。第二种形式“return (表达式)”计算表达式的值并将该值返回给调用表达式。在每个函数的末尾有一个隐含的“return (0)”。这允许一个函数终止并返回0,而不需要显式返回语句。

函数还会改变变量ibase的用法。函数体中的所有常量都将在函数调用时使用ibase的值进行转换。在函数执行过程中,ibase的更改将被忽略,但标准函数读取除外,后者将始终使用ibase的当前值来转换数字。

     当前版本的bc,在函数中添加了几个扩展。首先,定义的格式稍微放松了一些。标准要求开始大括号与定义关键字在同一行,所有其他部分必须在下面的行上。这个版本的bc将允许之前的任何数目的换行符。在函数的开头支撑之后,例如,下面的定义是合法的:

        define  d  (n)  { return  (2*n); }

       define  d  (n)

        { return  (2*n); }

     5)void类型

函数可以定义为void。空函数不返回值,因此可能不会在任何需要值的地方使用。空函数在输入行调用时不会产生任何输出。关键字void放在关键字定义和函数名称之间。例如,请考虑下面的例子

define  py (y)  { print "--->", y, "<---", "0; }

define  void  px (x)  { print "--->", x, "<---", "0; }

py(1)

--->1<---

0                   //由于py不是void,因此有默认返回值,因此这里打印了它的返回值,

px(1)

--->1<---           //px是void类型,最后不会打印返回值

此外,还为数组添加了按变量调用。为了申明一个数组变量,函数中的数组参数是这样定义的“*name[]” 。

7、数学库

     1)如果使用“-l”选项调用bc,则预加载一个数学库,并将默认精度设置为20。数学库中有一下的函数:
        s(x),计算x的正弦值,x是弧度值。
        c(x),计算x的余弦值,x是弧度值。
        a(x),计算x的反正切值,返回弧度。
        l(x),计算x的自然对数。   
        e(x),e的x次方。
        j(n,x),从n到x的阶数。

     2)例子

     下面的句子可以将“pi”的值赋值给shell变量pi

pi = $(echo  "scale=10; 4*a(1)"  |  bc  -l)

下面的句子就是数学库中e的次方定义方式

scale = 20

/* Uses the fact that e^x = (e^(x/2))^2

    When x is small enough, we use the series:

    e^x = 1 + x + x^2/2! + x^3/3! + ...

*/

define e(x) {

    auto  a, d, e, f, i, m, v, z

    /* Check the sign of x. */

    if (x<0) {

        m = 1

        x = -x

    }

    /* Precondition x. */

    z = scale;

    scale = 4 + z + .44*x;

    while (x > 1) {

        f += 1;

        x /= 2;

    }

    /* Initialize the variables. */

    v = 1+x

    a = x

    d = 1

    for (i=2; 1; i++) {

        e = (a *= x) / (d *= i)

        if (e == 0) {

            if (f>0) while (f--)  v = v*v;

            scale = z

            if (m) return (1/v);

        return (v/1);

        }

        v += e

    }

}

     下面的语句实现一个计算支票簿余额的简单程序

scale=2

print "\nCheck book program!\n"

print "  Remember, deposits are negative transactions.\n"

print "  Exit by a 0 transaction.\n\n"

print "Initial balance? "; bal = read()

bal /= 1

print "\n"

while (1) {

    "current balance = "; bal

    "transaction? "; trans = read()

    if (trans == 0) break;

    bal -= trans

    bal /= 1

}

quit

     下面的语句采用递归的方式计算x的阶乘

define f (x) {

    if (x <= 1) return (1);

    return (f(x-1) * x);

}

8、readline和libedit选项

     可以编译GNU bc(通过一个配置选项)来使用GNU readline输入编辑器库或bsd libedit库。这允许用户在将行发送到bc之前进行编辑。它还允许保存以前键入的行的历史记录。当选择此选项时,bc还有一个特殊变量。变量“history”是保留的历史记录行数。对于readline,值-1表示不限制历史记录的行数,0将禁用历史记录功能,默认值为100。

9、差别

这个版本的bc是从POSIX P 1003.2/D11草案中实现的,包含了与草案和传统实现相比的一些区别和扩展,它不是以传统的方式使bc(1)实现的,这个版本是一个解析和运行程序字节代码转换的单一进程。这里有一个“无文档”选项(-c),它导致程序将字节码输出到标准输出,而不是运行它。它主要用于调试解析器和准备数学库。差异的一个主要来源是扩展,下面列出一些差异和扩展:

     1)LANG环境变量,此版本在处理lang环境变量和从lc_开始的所有环境变量时不符合POSIX标准。

     2)名字,传统和POSIX bc都有用于函数、变量和数组的单字母名称。它们被扩展为以字母开头的多字符名称,可以包含字母、数字和下划线字符。

     3)字符串,字符串不允许包含NUL字符。POSIX表示所有字符都必须包含在字符串中。

     4)last,POSIX bc中没有last变量。

     5)比较,POSIX bc只允许在if语句、while语句和for语句的第二个表达式中进行比较。

     6)if语句,POSIX bc中if语句没有else。

     7)for语句,POIX bc中要求for语句中的3个表达式都必须具备。

     8)&&,||,!,POSIX bc中没有逻辑运算。

     9)read,POSIX bc没有read功能。

     10)打印语句,POSIX bc没有打印语句。

     11)continue语句,POSIX bc没有continue语句。

     12)return,POSIX bc要求return的表达式加括号。

     13)数组参数,POSIX bc不(目前)完全支持数组参数。POSIX语法允许函数定义中的数组,但没有提供将数组指定为实际参数的方法。(这很可能是语法上的疏忽。)传统的bc实现只通过值数组参数进行调用。

     14)函数,POSIX bc要求函数开头的大括号和define关键字在同一行,语句在下一行。

     15)=+, =-, =*, =/, =%, =^。POSIX bc不要求定义这些“旧样式”赋值操作符。此版本可能允许这些“旧样式”赋值。使用限制语句查看安装的版本是否支持它们。如果它确实支持“旧样式”赋值运算符,则“a=-1”语句将使a减少1,而不是将a设置为值-1。

     16)数字中的空格,bc的其他实现允许数字空格。例如,“x=1 3”将值13赋值给变量x。相同的语句将导致bc版本中的语法错误。

     17)错误和执行,在程序中发现语法和其他错误时,此实现与其他实现的代码不同。如果在函数定义中发现语法错误,则错误恢复机制将尝试查找语句的开头并继续解析函数。一旦在函数中发现语法错误,该函数将不可调用并变为未定义。交互执行代码中的语法错误将使当前执行块失效。执行块由在完整语句序列之后出现的行尾终止。例如

     a = 1

     b = 2

这个语句有两个执行块,而下面的语句

     {a = 1

     b = 2}

只有一个执行块。任何运行时错误都会终止当前的执行块,而警告则不会。

     18)中断,在交互会话期间,SIGINT信号(通常由终端上的“ctrl+c“生成)将导致当前执行块的执行中断。它将显示一个“运行时”错误,指示哪个功能被中断。在所有运行时结构被清除后,将打印一条消息通知用户bc准备好接收更多的输入。所有先前定义的函数都保留定义,所有非自动变量的值是中断点的值。在清理过程中,所有自动变量和函数参数都会被移除。对于一个非交互式会话,SIGINT信号将终止bc的整个运行。

10、限制

     下面列出当前bc程序的一些限制,有一些限制可能已经被用户修改过。

1)BC_BASE_MAX,最大输出基设置为999。最大输入基为16。

2)BC_DIM_MAX,这是当前分布的65535以内的任意限制,每个机器可能都不一样。

3)BC_SCALE_MAX,小数点前后的位数都由INT_MAX限制。

4)BC_STRING_MAX,字符串中的字符字数由INT_MAX限制。

5)exponent,指数运算中的指数值由LONG_MAX限制。

6)variable names,当前对每个简单变量、数组和函数名字的限制32767。

11、环境变量

     下面的环境变量由bc程序来控制

1)POSIXLY_CORRECT,和“-s”选项一样。

2)BC_ENV_ARGS,这是另一种获取bc参数的机制。格式与命令行参数相同。这些参数是先处理的,因此环境参数中列出的任何文件在任何命令行参数文件之前都会被处理。这允许用户设置“标准”选项和文件,以便在每次调用环境变量中的文件通常包含用户希望在每次运行bc时定义的函数定义。

3)BC_LINE_LENGTH,这应该是一个整数,指定数字输出行中的字符数。这包括用于长数字的反斜杠和换行符。,如果值是0,将禁用多行功能。此变量的任何其他值如果小于3,则将行长设置为70。

12、实例

     1)简单计算

[root@192 ~]# bc

bc 1.06.95      //欢迎语句

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.

This is free software with ABSOLUTELY NO WARRANTY.

For details type `warranty'.

12+23    //输入加法表达式,回车

35       //得到结果

100/25   //输入除法表达式,回车

4         //得到结果

quit     //退出指令

[root@192 ~]#

     2)执行for循环语句

for(i=0; i<3; i++){print "hello\n"}   //这是一个打印语句

hello

hello

hello

3)从文件读取内容并且执行bc

[root@localhost /]# cat test.c                 //查看文件的内容,里面全是bc语句

/*define 3 functions add,sub,mul*/

define add(x,y){

    return x+y;

}

define sub(x,y){

    return x-y;

}

define mul(x,y){

    return x*y;

}

/*for statement*/

for(i=0;i<3;i++){

    print "bc test ",i,"\n";

}

/*print statement*/

print "10+5=",add(10,5),"\n"

print "10-5=",sub(10,5),"\n"

print "10&5=",mul(10,5),"\n"

/*quit bc program*/

quit

[root@localhost /]# bc test.c                   //bc程序从文件获取到代码,然后执行

bc 1.06.95

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.

This is free software with ABSOLUTELY NO WARRANTY.

For details type `warranty'.

bc test 0

bc test 1

bc test 2

10+5=15

10-5=5

10&5=50




您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP