ksh 简单变量

-- Start

常量

#!/bin/ksh

# 定义常量方法 1
typeset -r CONSTANT_INT=110;


# 定义常量方法 2
readonly CONSTANT_STR="TEST";

数值变量

#!/bin/ksh

# 定义整数变量
integer var_int1=10; # 方法 1(推荐)
typeset -i var_int2=-10; # 方法 2
let "var_int3=20"; # 方法 3
((var_int4=30)); # 方法4
integer var_int5=010; # 八进制以 0 开头
integer var_int6=0x10; # 十六进制以 0x 开头

#--- 2# 表示后面的数字是二进制
#--- B#N B表示进制,最大 64
integer var_int5=2#10;


# 定义浮点数变量
float var_float1=250.0; # 方法 1(推荐)
typeset -F var_float2=250.; # 方法 2
typeset -F var_float3=0.25;
typeset -F var_float4=.25;
typeset -F var_float5=-250.0e2; # -250.0乘以 10 的 2 次方,e不区分大小写


# typeset -E 用来定义双精度浮点数变量
typeset -E var_double1=250.0;
typeset -E var_double2=250.;
typeset -E var_double3=0.25;
typeset -E var_double4=.25;
typeset -E var_double5=-250.0e2; # -250.0乘以 10 的 2 次方,e不区分大小写

字符串变量

#!/bin/ksh  
  
  
################################ 定义字符串

# 方式1:双引号  
# 双引号内的字符串可以进行变量插值和字符转义  
typeset str="Zhang San";  
typeset string="Li Si";  
typeset text1="my name is $str\n"; #此处的 $str 将被字符串张三替换,这种能力称之为变量插值,\n 为转义字符  
typeset text2="my name is $string\n"; # 此处的变量到底是 $str 还是 $string 呢?默认是最长匹配,也就是$string  
typeset text3="my name is ${str}ing\n"; # 如果想插入变量 $str的值,可以将变量名用大括号围起来  
  
  
# 方式2:单引号  
# 单引号内的任何字符都代表它自己,无法进行变量插值和字符转义  
typeset text4='my name is $str\n'; #此处的 $str 无法被替换为张三,\n 也无法代表换行符



################################ 字符串操作
######################### 长度 
# ${#xx} 得到变量 xx 的长度 
print "the length of $str is ${#str}";


######################### 子串
# ${xx:start} 从 start 开始得到变量 xx 的子串
print "Get substring from 11: ${text1:11}";

# ${xx:start:length} 从 start 开始,取 length 个字符,得到变量 xx 的子串
print "Get substring from 11 and get 5 characters: ${text1:11:5}";

# ${xx:start} 和 ${xx:start:length}, 注意 start 可以是负值哦,表示相对于字符串的末尾
print "Get substring from -9: ${text1:-9}";


######################### 替换
# ${xx/pattern/replace} pattern 是个正则表达式,将变量 xx 中 pattern 匹配的字串替换成 replace 指定的字符串,非贪婪模式 
print "text1 after replaced Zhang to Wang: ${text1/Zhang/Wang}";

# ${xx//pattern/replace} 同上,贪婪模式 
print "text1 after replaced Zhang to Wang: ${text1//Zhang/Wang}";

# ksh 不支持 行首,行尾,单词边界 正则表达式,下面的方式实现了类似功能
# ${xx/#pattern/replace} pattern 是个正则表达式,从变量 xx 开头查找 pattern 匹配的字串替,如果找到则换成 replace 指定的字符串,非贪婪模式
print "str after replaced Zhang to Wang: ${str/#Zhang/Wang}";

# ${xx/%pattern/replace} pattern 是个正则表达式,查找变量 xx 是否以 pattern 匹配的字串替结尾,如果找到则换成 replace 指定的字符串,非贪婪模式
print "str after replaced San to Four: ${str/%San/Four}";


######################### 删除子串
# ${xx/pattern} pattern 是个正则表达式,删除变量 xx 中 pattern 匹配的子串,非贪婪模式 
print "text1 after removed Zhang: ${text1/Zhang}";

# ksh 不支持 行首,行尾,单词边界 正则表达式,下面的方式实现了类似功能
# ${xx#pattern} pattern 是个正则表达式,从变量 xx 开头查找 pattern 匹配的字串替,如果找到则删除,非贪婪模式
print "str after removed Zhang: ${str#Zhang}";

# ${xx##pattern} 同上,贪婪模式
print "str after removed Zhang: ${str##Zhang}";

# ${xx%pattern} pattern 是个正则表达式,查找变量 xx 是否以 pattern 匹配的字串替结尾,如果找到则删除,非贪婪模式
print "str after removed San: ${str%San}";

# ${xx%%pattern} 同上,贪婪模式
print "str after removed San: ${str%San}";


######################### 判断是否为空
# 接收参数  
name=$1;  
age=$2;  
gendar=$3;  
description=$4;  
  
# ${xx:-"test"} 表示如果变量 xx 存在且不为 null,返回其值,否则返回  test
name=${name:-"Shang Bo"};  
print "name=$name";  
  
# ${xx:='test'} 表示如果变量 xx 存在且不为 null,返回其值,否则设置 xx 为 test 并返回 test  
age=${age:='30'};  
print "age=$age";  
  
# ${xx:+'test'} 表示如果变量 xx 存在且不为 null,返回 test, 否则返回 null  
description="a java developer";  
print "${description:+'description already defined'}";  
  
# ${xx:?"error"} 表示如果变量 xx 存在且不为 null,返回其值,否则显示 error 错误消息 并终止程序  
gendar=${gendar:?"gendar missing."};  

# -n 判断字符串不为空,长度不为0  
if [ -n "$name" ]; then  
    print "#** $name is not empty **#"  
fi  

# -z 判断字符串为空.长度为0.  
if [ -z "$x" ];then  
    print "#** $x is empty **#"  
fi 


######################### 其他
# ${!xx*} 或 ${!xx@} 得到 以 xx 开头的所有变量
print "We have variables ${!text*} who start with text";


我们还可以通过 typeset 命令来操作字符串。

#!/bin/ksh

alpha="   aBcDeFgHiJkLmNoPqRsTuVwXyZ   ";

# 去掉前面空格
typeset -L v=$alpha;
print "Remove leading spaces: $v";

# 去掉尾部空格
typeset -R v=$alpha;
print "Remove trailing spaces: $v";


# 去掉前面空格后,保留 10 位字符,如果长度不够 10 位则在尾部补空格
typeset -L10 v=$alpha;
print "truncate to 10 after remove leading spaces: $v";

# 去掉尾部空格,保留 16 位字符,如果长度不够 16 位则在前面补空格
typeset -R16 v=$alpha;
print "truncate to 16 after remove trailing spaces: $v";


# 在前面补 0 使整个数字成 8 位
typeset -Z8 v="123.50"
print "add leading 0: $v";

# 去掉前面的 0 使整个数字成 6 位
typeset -LZ6 v="00123.50"
print "strips leading 0: $v";


# 全部转成小写
typeset -l v=$alpha;
print "to lowercase: $v";

# 全部转成大写
typeset -u v=$alpha;
print "to uppercase: $v";

转义字符

ksh 支持如下转义字符。

\a	响铃
\b	退格
\c  终止处理字符串
\E	Esc键
\f	换页
\n	换行
\r	回车
\t	水平制表符
\v	垂直制表符
\0n 表示n为8进制数字
\\	反斜线

变量作用域

#!/bin/ksh

# 定义函数
function fun_test {
	# 定义局部变量
	typeset local_vardefined_in_function="local variable defined in function";

	# 在函数中定义全局变量	
	global_var_defined_in_function="global variable defined in function";
	
	# 改变全局变量的值
	global_var_defined_in_main+=" changed in function";
}

# 定义全局变量
typeset global_var_defined_in_main="global variable defined in main";
print "global_var_defined_in_main=$global_var_defined_in_main";


# 调用函数
print "Call function";
fun_test;


# 打印值是否改变
print "global_var_defined_in_main=$global_var_defined_in_main";
print "global_var_defined_in_function=$global_var_defined_in_function";
print "local_vardefined_in_function=$local_vardefined_in_function";

结果如下

global_var_defined_in_main=global variable defined in main
Call function
global_var_defined_in_main=global variable defined in main changed in function
global_var_defined_in_function=global variable defined in function
local_vardefined_in_function=


变量导出

#!/bin/ksh

# 导出变量方法 1
typeset -x CONSTANT_INT=110;


# 导出变量方法 2
export CONSTANT_STR="TEST";

-- 更多参见:ksh 精萃

-- 声 明:转载请注明出处

-- Last Updated on 2015-10-05
-- Written by ShangBo on 2015-09-22
-- End


你可能感兴趣的:(KSH)