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--当前登录用户名
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的文件 command1 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跳过