• linux bash shell之declare


    declaretypeset内建命令(它们是完全相同的)可以用来限定变量的属性.这是在某些编程语言中使用的定义类型不严格的方式。命令declare是bash版本2之后才有的。命令typeset也可以在ksh脚本中运行。

    declare/typeset 选项

    -r 只读
       1 declare -r var1

    (declare -r var1readonly var1作用相同)

    这大致和C的const限定词相同.一个试图改变只读变量值的操作将会引起错误信息而失败.

    -i 整数
       1 declare -i number
       2 # 脚本余下的部分会把"number"当作整数看待.		
       3 
       4 number=3
       5 echo "Number = $number"     # Number = 3
       6 
       7 number=three
       8 echo "Number = $number"     # Number = 0
       9 # 脚本尝试把字符串"three"作为整数来求值(译者注:当然会失败,所以出现值为0).

    某些算术计算允许在被声明为整数的变量中完成,而不需要特别使用expr或let来完成。

       1 n=6/3
       2 echo "n = $n"       # n = 6/3
       3 
       4 declare -i n
       5 n=6/3
       6 echo "n = $n"       # n = 2
    -a 数组
       1 declare -a indices

    变量indices会被当作数组.

    -f 函数
       1 declare -f

    在脚本中没有带任何参数的declare -f 会列出所有在此脚本前面已定义的函数出来。

       1 declare -f function_name

    declare -f function_name则只会列出指定的函数.

    -x export
       1 declare -x var3

    这样将声明一个变量作为脚本的环境变量而被导出。

    -x var=$value
       1 declare -x var3=373

    declare命令允许在声明变量类型的时候同时给变量赋值。


    例子 9-21. 用declare来声明变量类型

       1 #!/bin/bash
       2 
       3 func1 ()
       4 {
       5 echo This is a function.
       6 }
       7 
       8 declare -f        # 列出上面的函数.
       9 
      10 echo
      11 
      12 declare -i var1   # var1是一个整数.
      13 var1=2367
      14 echo "var1 declared as $var1"
      15 var1=var1+1       # 整数声明后,不需要使用'let'.
      16 echo "var1 incremented by 1 is $var1."
      17 # 试图将已声明为整数的变量的值更改为浮点值.
      18 echo "Attempting to change var1 to floating point value, 2367.1."
      19 var1=2367.1       # 引起一个错误信息,此变量的值保持原样.
      20 echo "var1 is still $var1"
      21 
      22 echo
      23 
      24 declare -r var2=13.36         # 'declare'允许设置变量的属性,
      25                               #+ 同时也给变量赋值.
      26 echo "var2 declared as $var2" # 试图更改只读变量的值.
      27 var2=13.37                    # 引起错误,并且从脚本退出.
      28 
      29 echo "var2 is still $var2"    # 这行不会被执行.
      30 
      31 exit 0                        # 脚本不会从这儿退出.

    Caution

    使用内建的declare来限定变量的范围.

       1 foo ()
       2 {
       3 FOO="bar"
       4 }
       5 
       6 bar ()
       7 {
       8 foo
       9 echo $FOO
      10 }
      11 
      12 bar   # 打印 bar.

    然而 . . .

       1 foo (){
       2 declare FOO="bar"
       3 }
       4 
       5 bar ()
       6 {
       7 foo
       8 echo $FOO
       9 }
      10 
      11 bar  # 什么也不打印.
      12 
      13 
      14 # 多谢Michael Iatrou指出这一点.
  • 相关阅读:
    出现org.apache.ibatis.binding.BindingException异常
    EasyExcel读写操作
    window下运行nginx出现nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)
    vue Module build failed: Error: Missing binding E:vuevue-demo ode_modules ode-sa ssvendorwin64
    Axios谷粒学院学习
    springboot中数据库的连接
    多表删除,删除一个表的同时删除中间表
    今天写了一个SSM小项目,运行之后,前端页面的CSS、js样式显示不出来,具体操作如下:
    Java中Iterator(迭代器)实现原理
    写一些东西,记录一下成长的过程
  • 原文地址:https://www.cnblogs.com/fhefh/p/2024857.html
Copyright © 2020-2023  润新知