ksh 简单变量

来源:互联网 发布:郑州编程班 编辑:程序博客网 时间:2024/05/29 18:52

-- Start

常量

#!/bin/ksh# 定义常量方法 1typeset -r CONSTANT_INT=110;# 定义常量方法 2readonly CONSTANT_STR="TEST";

数值变量

#!/bin/ksh# 定义整数变量integer var_int1=10; # 方法 1(推荐)typeset -i var_int2=-10; # 方法 2let "var_int3=20"; # 方法 3((var_int4=30)); # 方法4integer var_int5=010; # 八进制以 0 开头integer var_int6=0x10; # 十六进制以 0x 开头#--- 2# 表示后面的数字是二进制#--- B#N B表示进制,最大 64integer var_int5=2#10;# 定义浮点数变量float var_float1=250.0; # 方法 1(推荐)typeset -F var_float2=250.; # 方法 2typeset -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,返回其值,否则返回  testname=${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/kshalpha="   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";<span style="font-size:18px;"></span>

转义字符

ksh 支持如下转义字符。

\a响铃\b退格\c  终止处理字符串\EEsc键\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 mainCall functionglobal_var_defined_in_main=global variable defined in main changed in functionglobal_var_defined_in_function=global variable defined in functionlocal_vardefined_in_function=


变量导出

#!/bin/ksh# 导出变量方法 1typeset -x CONSTANT_INT=110;# 导出变量方法 2export CONSTANT_STR="TEST";

-- 更多参见:ksh 精萃

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

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


0 0