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
[email protected] 包含所有命令行参数 $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
命令演示:
[email protected]:~/workspace/shell# export TEST=test
[email protected]:~/workspace/shell# echo $TEST
test
[email protected]:~/workspace/shell# TEST=$TEST:/home/lg
[email protected]:~/workspace/shell# echo $TEST
test:/home/lg
[email protected]:~/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"
[email protected]:~/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
执行效果:
[email protected]:~/workspace/shell# ./3.sh yes
yes is yes
[email protected]:~/workspace/shell# ./3.sh 18
18 is 18
[email protected]:~/workspace/shell# ./3.sh hello
./3.sh: line 6: [: hello: integer expression expected
hello is a directory
[email protected]:~/workspace/shell# ./3.sh 19
19 I don‘t know
[email protected]:~/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语句结束
执行效果:
[email protected]:~/workspace/shell# ./4.sh
no argument is declared
[email protected]:~/workspace/shell# ./4.sh file1
user selects file1
[email protected]:~/workspace/shell# ./4.sh file2
user selects file2
[email protected]:~/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
执行效果:
[email protected]:~/workspace/shell# ls
2.sh 3.sh 4.sh 5.sh b.c hello one.sh
[email protected]:~/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
~
执行效果
[email protected]:~/workspace/shell# ls
1 2 2.sh 3 3.sh 4 4.sh 5.sh 7.sh b.c hello one.sh
[email protected]:~/workspace/shell# ./7.sh file 6
[email protected]:~/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
[email protected]:~/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
执行效果:
[email protected]:~/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
执行效果:
[email protected]:~/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 *******************
执行效果:
[email protected]:~/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
执行效果:
[email protected]:~/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
执行效果:
[email protected]:~/workspace/shell# ./12.sh
a in function = 1
b in function = 2
a in function =
b in function = 2
[email protected]:~/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\n");
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 }