当前位置:文档之家› Linux shell编程学习笔记

Linux shell编程学习笔记

Linux shell编程学习笔记
Linux shell编程学习笔记

Linux shell编程学习笔记(一)

第一章: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

51 2

601

700

●连接ln

硬连接 ln sourcefile targetfile连接后的target文件大小和source文件一样

软连接 ln -s sourcefile 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的输出项

④后台运行nohup command&可通过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

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

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跳过

相关主题
文本预览
相关文档 最新文档