• 脚本文件的编写和关于文件的基本函数的用法


    2015.1.21

    随笔:

    指令:cp -v 显示复制过程
    sort 按次序显示文件
    whereis 查找命令
    ln -s src dest 连接文件 dest -> src

    /etc/apt/sources.list //存放镜像的地址
    /var/lib/lists/* // 存放索引文件的地址
    /var/cache/apt/archives //下载的软件包缓存的地址


    编写shell脚本:三步走
    1.创建shell脚本,vim shell.sh
    2.修改权限,增加执行权限 chmod 777 shell.sh
    3.执行脚本 ./shell.sh bash shell.sh . shell.sh 三种方式



    定义变量,4种:变量一般大写
    1.用户自定义变量,引用需要加$符号,清除用unset;
    $COUNT=1 //等号中间没有空格
    调用;$echo $COUNT
    应用:$Y=2
    $X=$Y
    echo X=$X

    2.命令行参数变量,位置变量
    $0 ./a.out
    $1 第一个参数
    $2 .......

    3.shell预定义变量:
    $# 包含命令行参数的个数,不包含命令 one.sh a b c ->$#=3
    $@ 包含所有命令行参数 $1,$2...$9
    $* 包含所有命令行参数 $1,$2...$9
    $? 包含前一个命令(上一行命令)的退出状态,成功返回0,反之非0
    $$ 正在执行进程的ID ps -ef ,pstree,top三个命令都可以查看进程


    4.环境变量定义:
    $HOME
    $SHELL

    $export TEST=test
    命令效果:
    LANG=en_US.UTF-8
    TEST=test //增加的环境变量
    SHLVL=5


    使用unset命令删除变量赋值: $export TEST=test
    $unset TEST
    命令效果:
    LANG=en_US.UTF-8
    SHLVL=5 //上面的TEST被删除了

    在原来的环境变量后面追加,原来的不丢失: TEST=$TEST:/home/lg
    echo $TEST
    命令演示:
    root@lg-desktop:~/workspace/shell# export TEST=test
    root@lg-desktop:~/workspace/shell# echo $TEST
    test
    root@lg-desktop:~/workspace/shell# TEST=$TEST:/home/lg
    root@lg-desktop:~/workspace/shell# echo $TEST
    test:/home/lg
    root@lg-desktop:~/workspace/shell#


    shell语句:
    说明性语句:#开头,如:#!/bin/bash

    键盘读入变量的值:
    read 变量

    命令演示:
    #!/bin/bash
    read var1
    read var2
    echo $var1
    echo $var2

    算术运算:expr

    命令演示:
    #!/bin/bash
    read var1
    read var2
    add=·expr $var1 + $var2· //左右加反丿号,赋值给另一个变量
    sub=·expr $var1 - $var2·
    mul=·expr $var1 * $var2· //注意乘号的符号有点特殊,是 *
    div=·expr $var1 / $var2·
    mod=·expr $var1 % $var2·

    echo "add=$add"
    ......

    命令演示:
    #!/bin/bash
    2 read a
    3 read b
    4 echo "$a"
    5 echo "$b"
    6 add=`expr $a + $b`
    7 echo "add=$add"

    root@lg-desktop:~/workspace/shell# ./2.sh
    12
    34
    12
    34
    add=46


    条件测试语句:

    test命令可测试三种对象:字符串,整数,文件属性

    test "$1" = "yes" == [ "$1" = "yes" ] 两种方法都可以,注意两边的空格
    test $1 -eq 18 == [ $1 -eq 18 ]
    test -d $1 == [ -d $1 ]


    命令演示:
    脚本:编写的时候注意[]两边空格,if要与fi匹配,按最近原则匹配!
    1 #!/bin/bash
    2 if [ "$1" = "yes" ]
    3 then //then表示表达式为真
    4 echo "$1 is yes"
    5 else
    6 if [ $1 -eq 18 ]
    7 then
    8 echo "$1 is 18"
    9 else
    10 if [ -d $1 ]
    11 then
    12 echo "$1 is a directory"
    13 else
    14 echo "$1 I don't know"
    15 fi
    16 fi
    17 fi


    执行效果:
    root@lg-desktop:~/workspace/shell# ./3.sh yes
    yes is yes
    root@lg-desktop:~/workspace/shell# ./3.sh 18
    18 is 18
    root@lg-desktop:~/workspace/shell# ./3.sh hello
    ./3.sh: line 6: [: hello: integer expression expected
    hello is a directory
    root@lg-desktop:~/workspace/shell# ./3.sh 19
    19 I don't know
    root@lg-desktop:~/workspace/shell# vim 3.sh

    多路分支语句:
    脚本:编写时注意[]两边的空格,case和esac要配套使用。
    1#!/bin/bash
    2 if [ $# -eq 0 ]
    3 then
    4 echo " no argument is declared"
    5 exit
    6 fi
    7 case $1 in //注意格式,case后面是变量名在加in
    8 file1) //模式1 判断变量是不是等于file1
    9 echo "user selects file1" //命令表,可写多行
    10 ;; //注意这个分号,中间不能有空格,表示命令表1结束
    11 file2)
    12 echo "user selects file2"
    13 ;;
    14 *)
    15 echo "unknow"
    16 ;;
    17 esac //表示整条case语句结束

    执行效果:

    root@lg-desktop:~/workspace/shell# ./4.sh
    no argument is declared
    root@lg-desktop:~/workspace/shell# ./4.sh file1
    user selects file1
    root@lg-desktop:~/workspace/shell# ./4.sh file2
    user selects file2
    root@lg-desktop:~/workspace/shell# ./4.sh file
    unknow

    循环语句:for循环:将当前目录下的文件拷贝到当前目录下的backup中,backup不存在则创建一个。

    1 #!/bin/bash
    2 flist=`ls` //flist表示当前目录下的所有文件
    3 if [ ! -d backup ]
    4 then
    5 mkdir backup
    6 fi
    7 for file in $flist //for 变量名 in 变量表 ----> 变量名取变量表中的元素,知道全部取完为止
    8 do
    9 if [ $# = 1 ]
    10 then
    11 if [ $1 = $file ]
    12 then
    13 echo "$file found"
    14 exit
    15 fi
    16 else
    17 cp -av $file backup
    18 cp $file backup
    19 fi
    20 done

    执行效果:

    root@lg-desktop:~/workspace/shell# ls
    2.sh 3.sh 4.sh 5.sh b.c hello one.sh
    root@lg-desktop:~/workspace/shell# ./5.sh
    `2.sh' -> `backup/2.sh'
    `3.sh' -> `backup/3.sh'
    `4.sh' -> `backup/4.sh'
    `5.sh' -> `backup/5.sh'
    `b.c' -> `backup/b.c'
    `hello' -> `backup/hello'
    cp: omitting directory `hello'
    `one.sh' -> `backup/one.sh'


    while语句: while 表达式 (表达式真,执行循环),until 表达式 (表达式为假,执行循环)
    脚本:

    1 #!/bin/bash
    2 if [ $# -eq 2 ]
    3 then
    4 loop=$2
    5 else
    6 loop=5
    7 fi
    8 i=1
    9 while [ $i -lt $loop ] #until [ $i -gt $loop ]
    10 do
    11 > $1$i
    12 i=`expr $i + 1` //注意是反撇号
    13 done
    ~

    执行效果

    root@lg-desktop:~/workspace/shell# ls
    1 2 2.sh 3 3.sh 4 4.sh 5.sh 7.sh b.c hello one.sh
    root@lg-desktop:~/workspace/shell# ./7.sh file 6
    root@lg-desktop:~/workspace/shell# ls
    1 2.sh 3.sh 4.sh 7.sh file1 file3 file5 one.sh
    2 3 4 5.sh b.c file2 file4 hello
    root@lg-desktop:~/workspace/shell#

    continue 与 break的区别:
    continue跳出本次循环,break结束整个循环

    脚本:在输入的参数中找打印出偶数

    1 #!/bin/bash
    2 if [ $# -eq 0 ]
    3 then
    4 echo "please input some seguments"
    5 exit
    6 fi
    7 if [ $# -gt 10 ]
    8 then
    9 echo "too many seguments"
    10 exit
    11 fi
    12 for num
    13 do
    14 count=`expr $num % 2`
    15 if [ $count -eq 1 ]
    16 then
    17 continue
    18 else
    19 output="$output $num"
    20 fi
    21 done
    22 echo "enen num is $output"
    23

    执行效果:

    root@lg-desktop:~/workspace/shell# ./8.sh 1 2 3 4 5 6
    enen num is 2 4 6

    注:vim中冒号加行号直接跳到指定的行号,例如 :10,直接到10行


    shell函数:
    1.定义方式
    2.参数传递
    3.函数体类变量的引用

    shell中函数定义不需要写参数,函数体内调用参数用$1,$2,.....,传递参数直接在函数名后面添加参数!
    例:sum()
    脚本:

    1 #!/bin/bash
    2 sum()
    3 {
    4 a=$1
    5 b=$2
    6 n=`expr $a * $b`
    7 echo "n is $n"
    8 }
    9 sum $1 $2
    10

    执行效果:
    root@lg-desktop:~/workspace/shell# ./9.sh 2 3
    6

    函数的返回值调用用反撇号:

    返回状态:
    1.有return 返回return的值,
    2.没有return ,返回最后一条指令的返回状态

    脚本:
    1 #!/bin/bash
    2 sum()
    3 {
    4 a=$1 //表示传递的第一个参数
    5 b=$2 //表示传递的第二个参数
    6 n=`expr $a * $b`
    7 echo "n is $n"
    8 }
    9 #c=2
    10 #d=3 *******************
    11 #member=`sum $c $d` * //函数调用 *
    12 member=`sum 2 3` * //用了反撇号 *
    13 echo $member *******************

    执行效果:
    root@lg-desktop:~/workspace/shell# ./9.sh
    n is 6

    查找已登录的指定用户:
    脚本:
    1 #!/bin/bash
    2 check_user()
    3 {
    4 user=`who | grep $1 | wc -l`
    5 if [ $user -eq 0 ]
    6 then
    7 return 0
    8 else
    9 return 1
    10 fi
    11 }
    12 while true
    13 do
    14 echo "Input username"
    15 read uname
    16 check_user $uname
    17 if [ $? -eq 1 ]
    18 then
    19 echo "user $uname online"
    20 else
    21 echo "user $uname online"
    22 fi
    23 done


    执行效果:

    root@lg-desktop:~/workspace/shell# ./11.sh
    Input username
    lg
    user lg online
    Input username
    root
    user root online
    Input username

    shell的变量:

    1.声明局部变量:local var=5 //关键字:local
    局部变量只在定义的函数体内起作用
    2.全局变量:定以后,作用于脚本内任何地方
    3.独立于文件之外的变量:export var=50;多个脚本公用这个变量! //关键字export ,
    修改配置文件可永久作用于文件!
    脚本:
    1 #!/bin/bash
    2 scope()
    3 {
    4 local a=1 //局部变量
    5 b=2 //全局变量
    6 echo "a in function = $a"
    7 echo "b in function = $b"
    8 }
    9
    10 scope
    11 echo "a in function = $a"
    12 echo "b in function = $b"
    13

    执行效果:

    root@lg-desktop:~/workspace/shell# ./12.sh
    a in function = 1
    b in function = 2
    a in function =
    b in function = 2
    root@lg-desktop:~/workspace/shell#

    关于PCB的学习心得:
    1.要想在原理图中显示其他的字体,
    需要使能pcb editor下面的True type fonts (options->preference)

    2.在PCB布线的时候,首先将字符串信息隐藏,这样可以减少布线干扰:
    PCB面板左下角有个LS,点击,弹出面板的最上面一排有个Show/Hide,里面可以设置

    3.双面板,可以先铺设电源和地,用焊盘或者过孔代替固定孔,添加一个后复制粘贴即可!

    4.在对画好的PCB进行铺铜的时候,直接点击Place下面的铺铜,在里面更改顶层和底层也是很方便的,
    在铺铜结束后,可以整理一下字符串,这个时候可以先把铜箔隐藏,参考心得2

    API : 系统调用及用户编程接口

    linux系统调用,按照系统调用功能逻辑大致分为:进程控制,进程间通信,文件系统控制,系统控制,存储管理,
    socket控制,用户管理等几类!

    Linux中的文件主要分为4种:普通文件,目录文件,链接文件,设备文件。

    一个进程启动时,都会打开3个文件:标准输入,标准输入,标准出错处理,分别对应的文件描述符0,1和2
    (在程序中分别宏替换为:STDIN_FILENO,STDOUT_FILENO和STDERR_FILENO,学会巧妙运用这些宏替换)

    IO操作的系统调用,主要用到5个函数:open(),read(),write(),lseek(),close().
    int open(const char *pathname,int flags,int perms)
    成功:返回文件描述符,失败:-1
    pathname :被打开的文件
    O_RDONLY:只读
    o_WRONLY:只写
    O_RDWR:读写
    O_CREAT:如果文件不存在,则创建一个,并用第三个参数为其设置权限

    int close(int fd)
    0:成功 -1:出错

    ssize_t read(int fd,void *buf,size_t count)
    成功:返回读到的字节数; 失败:-1; 0:表示已读到文件尾

    ssize_t write(int fd,void *buf,size_t count)
    成功:已写的字节数 ;-1:出错

    off_t lseek(int fd,off_t offset,int whence)
    成功:文件当前位移,-1:出错

    总结一下5个函数的功能:
    open()函数用于打开或者创建文件,在打开或者创建文件时可以指定文件的属性及用户的权限等各种参数。
    close()函数用于关闭一个被打开的文件
    read() 函数用于将从指定的文件描述符中读出的数据放到缓冲区中,并返回实际读出的字节数,若返回0,
    则表示没有数据可读,即已经到达文件尾。读操作从文件当前指针位置开始,从终端设备文件中读取数据时,
    通常最多一次一行
    write()函数用于向打开的文件写数据,写操作从文件当前指针位置开始,对磁盘进行写操作,若磁盘已满或者
    超出该文件的长度,返回失败。
    lseek()函数用于在指定的文件描述符中将文件指针地位到相应的位置;

    实例程序:/*此程序属于华清远见编写,个人觉得对学习文件这块知识挺好的,摘录了下来*/
    1 #include <unistd.h>
    2 #include <sys/types.h>
    3 #include <sys/stat.h>
    4 #include <fcn1.h>
    5 #include <stdio.h>
    6 #include <stdlib.h>
    7
    8 #define BUFFER_SIZE 1024 //每次读写缓存大小,影响运行效率
    9 #define SRC_FILE_NAME "src_file" //源文件名
    10 #define DEST_FILE_NAME "dest_file" // 目标文件名
    11 #define OFFSE 10240 //复制数据大小
    12
    13 int main()
    14 {
    15 int src_file,dest_file;
    16 unsigned char buff[BUFFER_SIZE];
    17 int real_read_len;
    /* 以只读方式打开源文件*/
    18 src_file = open(SRC_FILE_NAME,O_REONLY);

    /*以只写方式打开目标文件,如果文件不存在则创建该文件,访问权限值为644*/
    /*S_I(R/W/X)(URP/GRP/OTH) R/W/X 表示读写执行权限 (URP/GRP/OTH)分别表示所有者,用户组,其他用户
    dest_file = open(DEST_FILE_NAME,O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
    20
    21
    22 if(src_file < 0 || dest_file < 0)
    23 {
    24 printf("open file error ");
    25 exit(1);
    26 }
    /*将源文件的读写指针移动到最后10K的起始位置*/
    27 lseek(src_file,-OFFSET,SEEK_END);
    /*读取源文件的最后10KB数据并写到目标文件中,每次读写1KB*/
    28 while((real_rea_len = read(src_file,buff, sizeof(buff))) > 0)
    29 {
    30
    31 write(dest_file,buff,real_read_len);
    32 }
    33 close(dest_file);
    34 close(src)_file);
    35 return 0;
    36 }

    ********************************************************************************************************************************************
    ********************************************************************************************************************************************

  • 相关阅读:
    WCF之ABC
    一次性为自定义实体类的数据填充
    在HttpHandlers中使用Session
    ASP.NET 2.0防止同一用户同时登陆
    Winson.Framework 1.5发布!
    SqlPager分页控件的使用!
    ExtJS 学习心得(一)
    [原创]Discuz!NT1.1高亮代码插件1.5稳定版!
    Winson.Framework 1.0发布!
    一个不错的WEB打印解决方案!
  • 原文地址:https://www.cnblogs.com/cnlg/p/4240334.html
Copyright © 2020-2023  润新知