脚本语言自学总结

文章目录

  • 1 perl
    • 1.1 基本知识
    • 1.2 正则表达式
      • 1.2.0 字符集
      • 1.2.1 匹配
      • 1.2.2 替换
      • 1.2.3 转化
      • 1.2.4 正则表达式例子
    • 1.3 hash
    • 1.4 XML::Simple
  • 2 shell脚本
  • 3 tcl脚本
    • 3.1 多行注释
    • 3.2 数组索引
    • 3.3 条件判断
    • 3.4 for循环
    • 3.5 文件I/O
  • 4 python脚本
    • 4.1 os模块
    • 4.2 logging模块

1 perl

1.1 基本知识

  1. 注释方法:
    #或者
    =pod
    =cut
    之间的部分
  2. 双引号和单引号的区别: 双引号可以正常解析一些转义字符与变量,而单引号无法解析会原样输出。
#!/usr/bin/perl
$a = 10;
print "a = $a\n";
print 'a = $a\n';

输出
a = 10
a = KaTeX parse error: Expected 'EOF', got '\n' at position 2: a\̲n̲ ̲3. perl中的变量用开头,数组从@开头;数组赋值给标量,返回数组元素个数

#!/usr/bin/perl
@ages = (25, 30, 40);#定义了一个3*1的数组,用$ages[i](i=0,1,2)来访问       
@names = ("google", "runoob", "taobao");
print "\$ages[0] = $ages[0]\n";
print "\$ages[1] = $ages[1]\n";
print "\$ages[2] = $ages[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";

双引号内在$前使用了转义字符\才能输出字符 $。
4. 函数:sub开头,函数参数在特殊数组@中,因此子程序第一个参数为 $[0], 第二个参数为 $_[1]

#!/usr/bin/perl
# 定义求平均值函数
sub Average{
   $n = scalar(@_);#得到数组个数
   $sum = 0;
   foreach $item (@_){
      $sum += $item;
   }
   $average = $sum / $n;
   print '传入的参数为 : ',"@_\n";           #打印整个数组
   print "第一个参数值为 : $_[0]\n";         #打印第一个参数
   print "传入参数的平均值为 : $average\n";  #打印平均值
}
# 调用函数
Average(10, 20, 30);
  1. 如果最后执行的是一条print语句,那么返回值是1
    die函数可以用来在出现错误的时候停止解释程序的运行,并输出一条有意义的出错消息。

1.2 正则表达式

=~表示相匹配,!~表示不匹配
perl处理完后会给匹配到的值存在三个特殊变量名:

  • $`: 匹配部分的前一部分字符串
  • $&: 匹配的字符串
  • $’: 还没有匹配的剩余字符串

1.2.0 字符集

  • [abc]:匹配a或b或c
  • [0-9]:数字
  • [^abc]:非的意思,匹配abc以外的任意字符
  • \d:[0-9]
  • \D:[^0-9]
  • \w:[0-9a-Z]
  • \W:[^0-9a-Z]
  • \v:垂直制表符
  • \r:回车符
  • \s:[\t\n\r\f]
  • {n}:匹配n次,如a{2}是匹配aa
  • {m,n}:匹配m-n次
  • ?:非贪婪模式,如a{1,3}?遇到aaa的话,会匹配a而不是aaa
  • :abc表示从abc开头,aabc就不能匹配
  • : a b c :abc :abc以abc结尾,abcc就不能匹配

1.2.1 匹配

m/要匹配的字符串/

  • m:(m^line\m表示对多行字符的行首和行位定位
  • \b匹配任何单词边界
  • \B不是一个单词边界的位置

1.2.2 替换

s/被替换的字符串/要换成的字符串/

  • i:取消大小写敏感
  • o:表达式只执行一次
  • g:替换所有的匹配的字符串
#把google替换成runoob
$string =~ s/google/runoob/;

1.2.3 转化

tr/要被转化的字符串/转化的字符串/

  • c:转化所有未指定字符
  • d:删除所有指定字符
  • s:把多个相同的输出字符缩成一个
#小写转化成大写
$string =~ tr/a-z/A-z/;
#把所有非数字字符替换为空格
$string =~ tr/\d/ /c;
#删除tab和空格
$string =~ tr/\t //d;
# 把数字间的其它字符替换为一个空格
$string =~ tr/0-9/ /cs    

1.2.4 正则表达式例子

1.匹配IP地址:m/\d+\.\d+\.\d+\.\d+/
\d:匹配一个数字字符
\d+:匹配一次或多次数字字符。
\.:使用转义字符匹配'.'
2.匹配邮箱
m/^[0-9a-zA-Z.-_]+\@[0-9a-zA-Z]+(\.[0-9a-zA-Z]+)+$
^:匹配开头
$:匹配结尾,这两个保证了这是连续的一串字符
3.匹配温度m/^([-+]?[0-9]+)([CF])$/
?:匹配前面的子表达式0次或1次
+:匹配前面的子表达式一次或多次
^:开头
4.匹配带小数点的正则表达式

比如说匹配邮箱

#! usr/bin/perl
$string="abc123\@sjtu.edu.cn";
if( $string =~ m/^[0-9a-zA-Z.-_]+\@[0-9a-zA-Z]+(\.[0-9a-zA-Z]+)+$/){
	print "It matched!\n"; 
}
else{
	print "don't match!\n"
}
print "$string\n"

1.3 hash

创建hash的方式

$data{'google'} = 'google.com';
$data{'runoob'} = 'runoob.com';
$data{'taobao'} = 'taobao.com';
或直接一句话
%data = ('google', 'google.com', 'runoob', 'runoob.com', 'taobao', 'taobao.com');%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
#!/usr/bin/perl
%data = ('google', 'google.com', 'runoob', 'runoob.com', 'taobao', 'taobao.com');
print "\$data{'google'} = $data{'google'}\n";
print "\$data{'runoob'} = $data{'runoob'}\n";
print "\$data{'taobao'} = $data{'taobao'}\n";
@keys = keys %data;
$size = @keys;
print "1 - 哈希大小: $size\n";
@values = values %data;
$size = @values;
print "2 - 哈希大小: $size\n";
# 添加元素
$data{'facebook'} = 'facebook.com';
@keys = keys %data;
$size = @keys;
print "2 - 哈希大小: $size\n";
# 删除哈希中的元素
delete $data{'taobao'};
@keys = keys %data;
$size = @keys;
print "3 - 哈希大小: $size\n";

1.4 XML::Simple

假设XML内容如下:

<opt>
    <user login="grep" fullname="Gary R Epstein" />
    <user login="stty" fullname="Simon T Tyson" >
        <session pid="12345"/>
    user>
    <text>This is a test.text>
opt>

要这么写

#!/usr/bin/perl
use XML::Simple;
use Data::Dumper;
$xml = XMLin('sample.xml');
#print Dumper($xml);
@user=@{$xml->{'user'}};
#print Dumper(@user);
$len=@user;
#print "$len \n";
%zjm1=%{@user[0]};
print "$zjm1{'login'}\n";
print "$zjm1{'fullname'}\n";

2 shell脚本

echo "Please enter a score:"
read score
if [ -z "$score" ]
then
    echo "you enter nothing. please enter a score"
	read score
else
    if [ "$score" -lt 0 -o "$score" -gt 100 ]
    then
        echo "the score should be 0~100"
        read score
    else
        if [ "$score" -ge 90 ]
        then
            echo "the grade is a"
        elif [ "$score" -ge 80 ]
        then
            echo "the grade is b"
        fi
    fi
fi
#! /bin/bash
i=1
while [[ "$i" -lt 10 ]]
do
    let "square=i*i"
	echo "$i*$i=$square"
	let "i=i+1"
done

3 tcl脚本

tclsh ./try1.tcl

3.1 多行注释

#!/usr/bin/tclsh
#my first program in tcl
if 0 {
my first program in Tcl program
Its very simple
}
puts "Hello World! welcome to yiibai.com"

3.2 数组索引

#!/usr/bin/tclsh
set myVariable {red green blue}
puts [lindex $myVariable 2]
set myVariable "red green blue"
puts [lindex $myVariable 1]

3.3 条件判断

#!/usr/bin/tclsh
set a 100
set b 200
# check the boolean condition 
if { $a == 100 } {
   # if condition is true then check the following 
     if { $b == 200 } {
      #if condition is true then print the following 
      puts "Value of a is 100 and b is 200"
     }
   }
puts "Exact value of a is : $a"
puts "Exact value of b is : $b"

3.4 for循环

#!/usr/bin/tclsh
# for loop execution
for { set a 10}  {$a < 20} {incr a} {
   puts "value of a: $a"
}

3.5 文件I/O

!/usr/bin/tclsh
set fp [open "input.txt" w+]
puts $fp "test\ntest"
close $fp
set fp [open "input.txt" r]
while { [gets $fp data] >= 0 } {
   puts $data
}
close $fp

4 python脚本

4.1 os模块

  • os.path.exists(path)
  • os.getcwd():当前目录
  • os.path.split(path):把路径分割成 dirname 和 basename,返回一个元组
  • os.path.join(‘root’,‘test’,‘runoob.txt’):将目录和文件名合成一个路径
  • time.gmtime(os.path.getmtime(file)):以struct_time形式输出最近修改时间
  • os.system(“ls -l”) :直接调用linux命令

4.2 logging模块

import logging
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
handler = logging.FileHandler("log.txt")
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")

上面代码只在文件中输出,如果想在控制台上输出的话

console = logging.StreamHandler()
console.setLevel(logging.INFO)
logger.addHandler(console)

handler = logging.FileHandler(filename="test.log", encoding="utf-8")可以控制输出中文

你可能感兴趣的:(操作系统)