Purpose:
typeset用于设置变量属性,如大小写,宽度,左右对齐等都可以用typeset来控制, 当用typeset改变一个变量的属性时,这种改变是永久的,下面以ksh为例,演示typeset的几种典型用法

Example:
1. 无选项的执行typeset,则显示所有变量
# typeset
BASH=/usr/bin/bash
BASHOPTS=cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath:xpg_echo
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="9" [3]="1" [4]="release" [5]="i386-pc-solaris2.11")
BASH_VERSION='4.1.9(1)-release'
COLUMNS=143
DIRSTACK=()
DISPLAY=localhost:10.0
EUID=0

2.-u 将一个变量的字符变成大写
# typeset -u var=abc
# echo $var
ABC

3.-l 将一个变量的字符变成小写
# typeset -l var1=ABC
# echo $var1
abc

4.typeset其他用法: 
typeset -i num #强制num为一个整数,如: 
/home/lee#typeset -i num=10 
/home/lee#echo $num 
10 
/home/lee#typeset -i16 num=10 
/home/lee#echo $num 
16#a 
/home/lee#typeset -i2 num=10 
/home/lee#echo $num 
2#1010 
/home/lee#typeset -i8 num=10 
/home/lee#echo $num 
8#12

typeset -x #显示被导出的变量 
typeset a b c #如果在一个函数里定义,则把a b c创建为局部变量 
typeset -r x=var#设置一个只读变量

用途说明

declare命令是bash的一个内建命令,它可以用来声明shell变量,设置变量的属性(Declare variables and/or give them attributes)。该命令也可以写作typeset。虽然人们很少使用这个命令,如果知道了它的一些用法,就会发现这个命令还是挺有用的。

常用参数

格式:declare

格式:typeset

格式:declare -p

格式:typeset -p

显示所有变量的值。

格式:declare -p var

格式:typeset -p var

显示指定变量var的值。

格式:declare var=value

格式:typeset var=value

格式:var=value

声明变量并赋值。

格式:declare -i var

格式:typeset -i var

将变量var定义成整数。在之后就可以直接对表达式求值,结果只能是整数。如果求值失败或者不是整数,就设置为0。

格式:declare -r var

格式:typeset -r var

格式:readonly var

将变量var声明为只读变量。只读变量不允许修改,也不允许删除。

格式:declare -a var

格式:typeset -a var

将变量var声明为数组变量。但这没有必要。所有变量都不必显式定义就可以用作数组。事实上,在某种意义上,似乎所有变量都是数组,而且赋值给没有下标的变量与赋值给"[0]"相同。

格式:declare -f

格式:typeset -f

显示所有自定义函数,包括名称和函数体。

格式:declare -F

格式:typeset -F

显示所有自定义函数名称。

格式:declare -f func

格式:typeset -f func

只显示指定函数func的函数定义。

格式:declare -x var

格式:typeset -x var

格式:export var

将变量var设置成环境变量,这样在随后的脚本和程序中可以使用。

格式:declare -x var=value

格式:typeset -x var=value

格式:export var=value

将变量var设置陈环境变量,并赋值为value。

使用示例

示例一 declare是内建命令

[root@web ~]# type -a declare
declare is a shell builtin
[root@web ~]#

[root@jfht ~]# type -a typeset
typeset is a shell builtin
[root@jfht ~]#

示例二 declare -i之后可以直接对表达式求值

[root@web ~]# x=6/3
[root@web ~]# echo $x
6/3
[root@web ~]# declare -i x
[root@web ~]# echo $x    
6/3
[root@web ~]# x=6/3
[root@web ~]# echo $x
2

如果变量被声明成整数,可以把表达式直接赋值给它,bash会对它求值。

[root@jfht ~]# x=error
[root@jfht ~]# echo $x
0

如果变量被声明成整数,把一个结果不是整数的表达式赋值给它时,就会变成0.

[root@jfht ~]# x=3.14
-bash: 3.14: syntax error: invalid arithmetic operator (error token is ".14")
如果变量被声明成整数,把一个小数(浮点数)赋值给它时,也是不行的。因为bash并不内置对浮点数的支持。
[root@web ~]#

[root@jfht ~]# declare +i x

此命令的结果是取消变量x的整数类型属性。
[root@jfht ~]# x=6/3
[root@jfht ~]# echo $x
6/3

因为变量x不是整型变量,所以不会自动对表达式求值。可以采用下面两个方式。

[root@jfht ~]# x=$[6/3]
[root@jfht ~]# echo $x
2
[root@jfht ~]# x=$((6/3))
[root@jfht ~]# echo $x  
2
[root@jfht ~]#

示例三 声明只读变量

[root@jfht ~]# declare -r r
[root@jfht ~]# echo $r

[root@jfht ~]# r=xxx
-bash: r: readonly variable
[root@jfht ~]# declare -r r=xxx
-bash: declare: r: readonly variable
[root@jfht ~]# declare +r r   
-bash: declare: r: readonly variable
[root@jfht ~]#
[root@jfht ~]# declare +r r
-bash: declare: r: readonly variable
[root@jfht ~]#
[root@jfht ~]# unset r
-bash: unset: r: cannot unset: readonly variable
[root@jfht ~]#

示例四 声明数组变量(实际上,任何变量都可以当做数组来操作)

[root@jfht ~]# declare -a names
[root@jfht ~]# names=Jack
[root@jfht ~]# echo ${names[0]}
Jack
[root@jfht ~]# names[1]=Bone
[root@jfht ~]# echo ${names[1]}
Bone
[root@jfht ~]# echo ${names}
Jack
[root@jfht ~]# echo ${names[*]}
Jack Bone
[root@jfht ~]# echo ${#names}
4

直接引用names,相当于引用names[0]
[root@jfht ~]# echo ${#names[*]}
2

[root@jfht ~]# echo ${names[@]}
Jack Bone
[root@jfht ~]# echo ${#names[@]}
2

[root@jfht ~]# declare -p names   
declare -a names='([0]="Jack" [1]="Bone")'
[root@jfht ~]#

示例五 显示函数定义

[root@jfht ~]# declare -F
declare -f add_jar
declare -f add_jar2
declare -f add_jar3
[root@jfht ~]# declare -f
add_jar ()
{
    [ -e $1 ] && CLASSPATH=$CLASSPATH:$1
}
add_jar2 ()
{
    if [ -e $1 ]; then
        CLASSPATH=$CLASSPATH:$1;
    else
        if [ -e $2 ]; then
            CLASSPATH=$CLASSPATH:$2;
        fi;
    fi
}
add_jar3 ()
{
    if [ -e $1 ]; then
        CLASSPATH=$CLASSPATH:$1;
    else
        if [ -e $2 ]; then
            CLASSPATH=$CLASSPATH:$2;
        else
            if [ -e $3 ]; then
                CLASSPATH=$CLASSPATH:$3;
            fi;
        fi;
    fi
}
[root@jfht ~]# declare -f add_jar
add_jar ()
{
    [ -e $1 ] && CLASSPATH=$CLASSPATH:$1
}
[root@jfht ~]# declare -F add_jar
add_jar
[root@jfht ~]# declare -F add_
[root@jfht ~]# declare -F add_*
[root@jfht ~]# declare -F 'add_*'
[root@jfht ~]#

问题思考

相关资料

【1】Aric小屋 linux bash shell之declare
http://www.cnblogs.com/fhefh/archive/2011/04/22/2024857.html
【2】译言网 Bash中的declare语句
http://article.yeeyan.org/view/20180/38866
【3】Advanced Bash-Scripting Guide:  9.2. Typing variables: declare or typeset
http://tldp.org/LDP/abs/html/declareref.html
【4】Advanced Bash-Scripting Guide:  Chapter 27. Arrays
http://tldp.org/LDP/abs/html/arrays.html#ARRAYREF
【5】php_boy的专栏 bash (4) declare getopts noclobber
http://blog.csdn.net/php_boy/article/details/6416740

http://codingstandards.iteye.com/blog/1150109
http://blog.csdn.net/del1214/article/details/6843447

转载于:https://blog.51cto.com/leonkuo/751386

Korn Shell: typeset相关推荐

  1. oracle卸载ksh,oracle与ksh(Korn Shell) | 学步园

    汗~近几天在fedora下安装oracle数据库装了N遍才安装成功 貌似是因为忽略了oracle 与 ksh 密切联系导致的. 因为当我在.bash_profile上加上这一段代码之后安装过程才没有出 ...

  2. shell typeset命令的使用

    [保留] typeset的常见用法 http://www.chinaunix.net 作者:寂寞烈火  发表于:2007-12-16 09:50:34 [发表评论][查看原文][Shell讨论区][关 ...

  3. Linux Shell 通配符、元字符、转义符使用实例介绍--Learning the korn shell

    说到shell通配符(wildcard),大家在使用时候会经常用到.下面是一个实例: ? 1 ? 1 2 3 4 [chengmo@localhost ~/shell]$ls a.txt  b.txt ...

  4. 完善Linux/UNIX审计 将每个shell命令记入日志

    原文地址:http://os.51cto.com/art/201106/266928.htm 将用户执行的每个shell命令记入日志比最初想象的要来得困难.shell的历史功能原本旨在帮助用户使用以前 ...

  5. shell编程基础-简述

    1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚 ...

  6. Shell编程入门基础上

    前言 为什么学 Shell Shell 脚本语言是实现 Linux/UNIX 系统管理及自动化运维所必备的重要工具, Linux/UNIX 系统的底层及基础应用软件的核心大都涉及 Shell 脚本的内 ...

  7. Shell 基础介绍 [1]

    本文目录 1.什么是Shell? 2.脚本语言类型 3.其他常用的脚本语句种类 4.Shell脚本的建立和执行 5.Shell 变量类型 6.普通变量 7.Shell 特殊重要变量 8.Shell进程 ...

  8. Linux Shell 编程实战技巧

    目前,越来越多的企业应用会部署在 Linux 系统上的,而 Linux Shell 脚本可以极大地帮助我们完成这些应用的运维任务.这使得 Linux Shell 开发技能成为开发人员的一项重要的.有竞 ...

  9. Shell脚本详解---一篇搞定

    有道云分享链接 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都 ...

最新文章

  1. 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML
  2. 一些SAP UI5代码审查的例子
  3. Visual C++位图操作
  4. 信息学奥赛一本通 1176:谁考了第k名 | OpenJudge NOI 1.10 01:谁考了第k名
  5. 我们用大数据创造没人能理解的人工智能
  6. JS 获取 URL 地址/参数
  7. xp安装python3.4_32位XP系统 Python3.4.4安装scrapy1.6.0
  8. breadweb控制台下载_路由器刷breed web控制台助手最新版
  9. Tomcat崩溃排查
  10. 利用photoshopcs6将gif格式图片变为背景透明
  11. java http put请求方式_HttpClient HTTP PUT请求方法示例
  12. TCP/IP网络通信协议
  13. 宣传文本html,优秀的宣传语(精选50句)
  14. 无光照渲染shader-二次元
  15. Python数据分析与机器学习
  16. C语言九条语句经典例题,一起温故而知新!!!
  17. 动态规划(Dynamic Programming)
  18. win10右击无法新建文件,只能新建文件夹和快捷方式
  19. Google的招聘要求
  20. Spark DataFrame的创建

热门文章

  1. 【Python】Python3中的str和bytes
  2. Sql Server之旅——第十一站 简单说说sqlserver的执行计划
  3. Lync Server 2013 部署前端池支持NLB吗?
  4. windows server2012
  5. 病毒导致分区双击无法打开的解决方法
  6. 结构体怎么赋值_Go 经典入门系列 16:结构体
  7. 对C语言 static作用——修饰 变量(全局变量/局部变量)、函数
  8. Echarts之悬浮框中的数据排序
  9. 【UWP】拖拽列表项的排序功能实现
  10. PHP报“Cannot start session without errors”