Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6319782
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: LINUX

2013-04-14 11:53:21

原文地址:linux_shell编程学习笔记 作者:s270768095

 

一、shell基础
●umask  --查看当前用户创建文件或文件夹时的默认权限
eg:
[test@szbirdora 1]$umask
0002
[test@szbirdora 1]$ls -lh
-rw-rw-r--     test test   myfile   
drwxrwxr-x     test test 1
上面的例子中我们看到由test默认创建的文件myfile和文件夹1的权限分别为664,775.而通过umask查到的默认权限为002.所以可以推断出umask的计算算法为:
umask                  file                      directory
0                           6                            7
1                           5                             6
2                           4                            5
3                           3                            4
4                            2                            3
5      1           2
6      0           1 
7      0            0

●连接ln
硬连接ln sourcefile targetfile                 连接后的target文件大小和source文件一样
软连接ln-ssourcefile targetfile             类似于windows的快捷方式

●shell script基本结构
#!/bin/bash                         --------bash shell开头必须部分
# description                         --------注释部分(可有可无,为了阅读方便最好加以说明)
variable name=value            ---------变量部分,声明变量,赋值
control segment                   ---------流程控制结构,如判断、循环、顺序
eg.
helloworld.sh
#! /bin/bash
# This is a helloworld shell script
printchar = "hello world"
echo $printchar

[test@szbirdora 1]$sh helloworld.sh
hello world

●shell特性
①别名         alias                 eg. alias ll =“ls -l”
②管道         a|b                  将a命令的输出作为b命令的输入eg. ls |sort  将ls列举的项排序
③命令替换  a`b`               将b命令的输出作为a命令的输入eg.  ls `cat myfile`列举出cat myfile的输出项
④后台运行  nohupcommand&   可通过jobs -l查看后台运行的脚本
⑤重定向      >,<                     可以改变程序运行的输出来源和输入来源
⑥变量                                      可以用$varname来调用变量
⑦特殊字符
                                        `用来替换命令
                   \用来使shell无法认出其后的特殊字符,使其失去特殊含义
                   ;允许一行放多个命令
                   ()创建成组的命令  ??
                   {}创建命令块      ??    


二、变量和运算符

●本地变量:在用户现在的shell生命期的脚本中使用。设置变量:various_name=value.可用set来查看。用readonly可以使变量只读。
●环境变量:用于当前用户下所有用户进程(不限于现在的shell)。
                     设置变量:export various_name=value。用env查看。
                     用readonly可以使变量只读。
●变量替换   
echo ${variable name}                  显示实际值到variable name
echo ${variable name:+value}    如果设置了variable name,则显示其值,否则为空
echo ${variable name:?value}    如果未设置variable name,则显现用户定义错误信息value
echo ${variable name:-value}     如果未设置,则显示其值
echo ${variable name:=value}     如果未设置,则设置其值,并显示
●清除变量                                   unset variable name
●位置变量
位置变量表示$0,$1,$2...$9
$0----脚本名字
$1----根据参数位置表示参数1
eg.
#! /bin/bash
#parm.sh
echo "This is script name : $0"
echo "This is parameter 1: $1"
echo "This is parameter 2: $2"
[test@szbirdora 1]$sh parm.sh a b
This is script name : parm.sh
This is parameter 1: a
This is parameter 2: b
●向系统中传递位置变量
#!/bin/bash
#parm.sh
find /u01/test/1 -name $1 -print
[test@szbirdora 1]$ sh parm.sh myfile
/u01/test/1/myfile
●标准变量                              bash默认建立了一些标准环境变量,可在/etc/profile中定义
EXINIT
HOME
IFS
LOGNAME                                      --当前登录用户名
MAIL
MAILPATH
PATH
TERM                                              --终端信息
TZ                                                  --时区
PS1                                                --登录提示,如[test@szbirdora 1]$
[test@szbirdora 1]$ echo $PS1
[\u@\h \W]\$                                   --\u -user --\h -host --\W -document
PS2                                               --一命令多行,换行提示,如>
PWD                                               --当前目录
MAILCHECK                                  --每隔多少秒检查是否有新邮件
[test@szbirdora 1]$ echo $MAILCHECK
60
SHELL
MANPATH                                      --帮助文档位置
TERMINFO                                    --终端信息
●特殊变量
$#         传递到脚本的参数个数
$*         以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$         脚本运行的当前进程ID号
$!         后台运行的最后一个进程的进程ID号
$@        传递到脚本的参数列表,并在引号中返回每个参数
$-         显示shell使用的当前选项,与set命令功能相同
$?        显示最后命令的退出状态,0表示没有错误,其他表示有错误
eg.
#!/bin/bash
#parm
echo "this is shellname: $0"
echo "this is parm1 :   $1"
echo "this is parm2 :   $2"
echo "show parm number : $#"
echo "show parm list :  $*"
echo "show process id:  $$"
echo "show precomm stat: $?"
[test@szbirdora 1]$ sh parm.sh a b
this is shellname: parm.sh
this is parm1 :   a
this is parm2 :   b
show parm number : 2
show parm list :  a b
show process id:  24544
show precomm stat: 0
●影响变量的命令
declare设置或显示变量
     -f    只显示函数名
      -r   创建只读变量
     -x    创建转出变量
      -i   创建整数变量
     使用+替代-,可以颠倒选项的含义
export
     -p  显示全部全局变量
shift[n]   移动位置变量,调整位置变量,使$3赋予$2,使$2赋予$1    n前移n
typeset    和declare同义

注意:双引号不能解析$,\,`三个字符,所以在双引号中可以引用变量、转义字符、替换变量
单引号可以解析,所以单引号中引用变量等无效
[test@szbirdora 1]$ echo "$test"
test
[test@szbirdora 1]$ echo '$test'
$test

●运算符类型
⒈按位运算符
~   取反
<<  左移运算符
>>  右移运算符
&   与
|    或
^    异或
$[ ]   表示形式告诉shell对方括号中表达式求值$[a+b]
2.逻辑运算符
&&
||
>,<,=,!=
3.赋值运算符
let variablename1 +=variablename1+ varablename2


三、shell的输入和输出
1.echo    echo [option] string
            -e解析转移字符
           -n回车不换行,linux系统默认回车换行
           转移字符\c \t \f \n
#!/bin/bash
#echo
echo -e "this echo's 3 newlne\n\n\n"
echo "OK"
echo
echo "this is echo's 3 ewline\n\n\n"
echo "this log file have all been done">mylogfile.txt
[test@szbirdora ~]$ sh echod.sh
this echo's 3 newlne

OK

this is echo's 3 ewline\n\n\n
上面可以看到有-e则可以解析转移字符,没有不能解析。echo空输出为空

2.read可以从键袒蛭募?哪骋恍形谋局卸寥胄畔ⅲ?⒔?涓掣?桓霰淞?br>read variable1 variable2
eg.
#!/bin/bash
#readname
echo -n "first name:"
read firstname
echo -n "last name:"
read lastname
echo "this name is $firstname $lastname"

3.cat       显示文件的内容,创建内容,还可以显示控制字符
           cat [options]filename1 filename2
                  -v  显示控制字符(Windows文件)
             cat命令不会分页显示,要分页可以采用more、less

4.管道|

5.tee     把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中,一般与管道合用
             tee [options] files
             -a在文件中追加
eg.
[test@szbirdora 1]$ echo |tee myfile

[test@szbirdora 1]$ cat myfile

将myfile文件置空

6.文件重定向
command>filename                                        ---覆盖输出
command>>filename                                      ---追加输出
command>filename>&1                                 ---把标准输出和标准错误重定向
command<
command
command<-                                                     ---关闭标准输入
>nullfile.txt                                                       ---创建字节为0的文件
command1command3               ---按从左到右顺序执行
eg.
说明:myfile为空间
[test@szbirdora 1]$df -lh>myfile
[test@szbirdora 1]$ cat myfile
Filesystem            Size Used Avail Use% Mounted on
/dev/sda1              20G 3.3G   16G 18% /
none                  2.0G     0 2.0G   0% /dev/shm
/dev/sda2              79G   17G   59G 23% /u01
/dev/sda4              28G 3.9G   22G 15% /u02
[test@szbirdora 1]$df -lh>myfile
[test@szbirdora 1]$ cat myfile
Filesystem            Size Used Avail Use% Mounted on
/dev/sda1              20G 3.3G   16G 18% /
none                  2.0G     0 2.0G   0% /dev/shm
/dev/sda2              79G   17G   59G 23% /u01
/dev/sda4              28G 3.9G   22G 15% /u02
[test@szbirdora 1]$df -lh>>myfile
[test@szbirdora 1]$ cat myfile
Filesystem            Size Used Avail Use% Mounted on
/dev/sda1              20G 3.3G   16G 18% /
none                  2.0G     0 2.0G   0% /dev/shm
/dev/sda2              79G   17G   59G 23% /u01
/dev/sda4              28G 3.9G   22G 15% /u02
Filesystem            Size Used Avail Use% Mounted on
/dev/sda1              20G 3.3G   16G 18% /
none                  2.0G     0 2.0G   0% /dev/shm
/dev/sda2              79G   17G   59G 23% /u01
/dev/sda4              28G 3.9G   22G 15% /u02
[test@szbirdora 1]$cat >>myfile<
> China
> Hubei
> Suizhou
> exit
[test@szbirdora 1]$ cat myfile
China
Hubei
Suizhou

7.exec       可以用来替代当前shell。现有任何环境变量都会清除


四、 控制流结构
1.if语句
if条件1
then
    命令1
elif条件2
then
    命令2
else
    命令3
fi
------------------
if条件
then命令
fi
eg:
#!/bin/bash
#if test
#this is a comment line
if [ "10" -lt "12" ];then
#yes 10 is less than 12
echo "yes,10 is less than 12"
else
echo "no"
fi
注意:if语句必须以fi终止
   "10"前一个空格,“12”后也有一个空格。这个条件都是通过test命令来指定。条件表达为test expression或者[expression]

条件表达式中的比较函数
man test
NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       [ EXPRESSION ]
       [ OPTION

DESCRIPTION
       Exit with the status determined by EXPRESSION.

       --help display this help and exit

       --version
              output version information and exit

       EXPRESSION is true or false and sets exit status. It is one of:

       ( EXPRESSION )
              EXPRESSION is true

       ! EXPRESSION
              EXPRESSION is false

       EXPRESSION1 -a EXPRESSION2
              both EXPRESSION1 and EXPRESSION2 are true

       EXPRESSION1 -o EXPRESSION2
              either EXPRESSION1 or EXPRESSION2 is true

       [-n] STRING
              the length of STRING is nonzero

       -z STRING
              the length of STRING is zero

       STRING1 = STRING2
              the strings are equal

       STRING1 != STRING2
               the strings are not equal

       INTEGER1 -eq INTEGER2
              INTEGER1 is equal to INTEGER2

       INTEGER1 -ge INTEGER2
              INTEGER1 is greater than or equal to INTEGER2

       INTEGER1 -gt INTEGER2
              INTEGER1 is greater than INTEGER2

       INTEGER1 -le INTEGER2
              INTEGER1 is less than or equal to INTEGER2

       INTEGER1 -lt INTEGER2
              INTEGER1 is less than INTEGER2

       INTEGER1 -ne INTEGER2
              INTEGER1 is not equal to INTEGER2

       FILE1 -ef FILE2
              FILE1 and FILE2 have the same device and inode numbers

       FILE1 -nt FILE2
              FILE1 is newer (modification date) than FILE2

       FILE1 -ot FILE2
              FILE1 is older than FILE2

       -b FILE
              FILE exists and is block special

       -c FILE
              FILE exists and is character special

       -d FILE
              FILE exists and is a directory

       -e FILE
              FILE exists

       -f FILE
              FILE exists and is a regular file
       -g FILE
              FILE exists and is set-group-ID

       -h FILE
              FILE exists and is a symbolic link (same as -L)

       -G FILE
              FILE exists and is owned by the effective group ID

       -k FILE
              FILE exists and has its sticky bit set

       -L FILE
              FILE exists and is a symbolic link (same as -h)

       -O FILE
              FILE exists and is owned by the effective user ID

       -p FILE
              FILE exists and is a named pipe

       -r FILE
              FILE exists and is readable

       -s FILE
              FILE exists and has a size greater than zero

       -S FILE
              FILE exists and is a socket

       -t [FD]
              file descriptor FD (stdout by default) is opened on a terminal

       -u FILE
              FILE exists and its set-user-ID bit is set

       -w FILE
              FILE exists and is writable

       -x FILE
             FILE exists and is executable

eg.
#!/bin/bash
#if test
#this is a comment line
echo "Enter your filename:"
read myfile
if [ -e $myfile ]
then
   if [ -s $myfile ];then
    echo "$myfile exist and size greater than zero"
   else
    echo "$myfile exist but size is zero"
   fi
else
echo "file no exist"
fi
[test@szbirdora 1]$ sh iftest.sh
Enter your filename:
11
11 exist but size is zero

2.case语句
case语句为多选择语句。
case值in
模式1)
   命令1
    ;;
模式2)
   命令2
    ;;
esac
eg.
#!/bin/bash
#case select
echo -n "enter a number from 1 to 3:"
read ans
case $ans in
1)
echo "you select 1"
;;
2)
echo "you select 2"
;;
3)
echo "you select 3"
;;
*)
echo "`basename $0`:this is not between 1 and 3">&2
exit;
;;
esac

3.for循环
for循环一般格式:
for变量名in列表(列表以空格作为分割)
do
  命令1
  命令2
done

eg:
#!/bin/bash
#forlist1
for loop in 1 2 3 4 5
do
echo $loop
done

4.until循环
until条件
do
  命令1
  命令2
   ...
done
条件测试发生在循环末尾,所以循环至少可以执行一次。

5.
while循环
while命令 (可以是一个命令也可以是多个,做条件测试)
do
     命令1
     命令2
      ...
done
注意:如果从文件中读入变量

6.break和continue控制
break跳出,continue跳过

阅读(568) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~