Linux学习——Shell编程学习笔记
2017-08-25 19:23
826 查看
一、学命令以前的基础知识
1、shell 脚本的结构
首先给出一个示例
执行结果:
正如上面的示例代码所示,shell 脚本的结构分成以下三部分:
#! 用来指定执行脚本的 shell ,不写就用默认的,一般是 bash
# 注释行,尽量把注释信息都描述一下,一般前面写脚本作用,后面写谁在什么时候写的
命令和控制结构,要用绝对路径
2、创建 shell 程序的步骤
(1)创建一个包含命令和控制结构的文件
(2)修改这个文件的权限使它可以执行,chmod u+x
(3)执行 ./example 或者 sh example
3、执行脚本的权限
普通用户想要执行某个脚本,需要有如下条件:
(1)直接写路径以./example的形式执行:
对脚本有rx权限
对脚本所在目录有rx权限
(2)以 sh example 的形式执行
对脚本有r权限
对脚本所在目录有rx权限
4、调试
(1)执行脚本,并显示所有变量的值
执行脚本时会给出执行过程,过程前面会加一个“+”
(2)不执行脚本,只是检查语法的模式,将返回所有语法错误
二、Shell 变量番外(1)
有两类:临时变量 和 永久变量
临时变量: shell程序内部定义的,使用范围仅限于定义它的程序,对其他程序不可见。包括自定义变量、位置变量
自定义变量: 由字母、数字、下划线组成,开头必须是字母或下划线,长度没限制,习惯全大写。赋值有三种情况:
(1)定义时赋值:NUM=1,=两边没有空格;包含多个字符时要用单引号或者双引号引上番外(1)
(2)将一个命令的执行结果赋给变量,TIME=`date`
(3)将一个变量赋给另一个变量,A=$B
位置变量: shell 解释执行用户命令时,将命令行的第一个部分作为命令名,其他部分作为参数。由出现在命令行上的位置确定的参数称为位置参数。
例如:ls -l file1 file2 file3
$0:”ls -l”是命令名
$n:这个程序的第n个参数,n = 1-9,这就是位置变量,位置变量可以直接在脚本里引用,$1,$2,$3 分别指 file1,file2,file3
永久变量: 环境变量,不随 shell 脚本的执行结束而消失。
此外,还有一些特殊变量
三、shell命令
read:从键盘读入数据,赋给变量
expr:对整数型变量进行算术运算,运算符两边是有空格的,否则会被当成一个表达式(字符串)输出
awk:将文件信息以指定符号分割,然后提取出相应的内容
-F 用来指定域分隔符,最常用的域分隔符是空格和冒号,默认是空格
例子:
(1)检测系统中 UID 为 0 的用户
思路:在 /etc/passwd 文件中,将每一条信息以冒号:分割,若 UID = 0,则输出用户名
(2)打印输出 PID 为 2441 的命令提示符名称
思路:先获取当前所有进程,再将每一条信息以空格分割,找出 PID 为 2441 的进程,但因其命令提示符名称
shift 指令:参数左移,每执行一次,参数序列顺次左移一个位置,$#的值减1,移出去的参数不再可用,用于分别处理每个参数
四、变量测试语句
用于测试变量是否相等、是否为空、文件类型等
格式: test 测试条件
测试范围:整数、字符串、文件
一般作为 if 语句的测试条件
字符串测试
整数测试
文件测试
五、流程控制语句
if
(1) if [ … ] then … fi // fi 为结束符
(2) if [ … ] then … else … fi
(3) if [ … ] then … elif … then … fi
(4) 多个条件的联合
-a:all,逻辑与
-o:or,逻辑或
for
for … done
格式:
select:把关键字中的每一项做成类似的表单,以交互的方式执行 do 和 done 之间的命令,使用的比较少
格式:
case
case…esac
格式:
while
格式:
until:类似while循环,不同的是 until 是条件返回值为假时才继续执行
格式:
跳出循环
break:跳出整个循环
continue:跳过本次循环,进行下次循环
函数
函数调用:直接写函数名,不带括号
函数中的变量:均为全局变量,没有局部变量
函数中的参数:调用函数时,可以传递参数,在函数中用 $1、$2 … 来引用
unset ABC 删除一个变量
(2)单引号 vs 双引号
单引号之间的内容会原封不动的指定给变量
双引号里的变量只是占位符,会用实际值替换掉
(3)几个命令
1)exit 0 退出程序执行,并返回一个返回码,返回码为 0 表示正常退出,非 0 表示非正常退出
2)ps -aux 显示进程启动用户的身份
3)kill -9 强行关闭
1、shell 脚本的结构
首先给出一个示例
#!/bin/bash # ————————————————————— # This script is used to understand the shell structure # ———————————————————— echo "We are currently in the following directory." /bin/pwd
执行结果:
正如上面的示例代码所示,shell 脚本的结构分成以下三部分:
#! 用来指定执行脚本的 shell ,不写就用默认的,一般是 bash
# 注释行,尽量把注释信息都描述一下,一般前面写脚本作用,后面写谁在什么时候写的
命令和控制结构,要用绝对路径
2、创建 shell 程序的步骤
(1)创建一个包含命令和控制结构的文件
(2)修改这个文件的权限使它可以执行,chmod u+x
(3)执行 ./example 或者 sh example
3、执行脚本的权限
普通用户想要执行某个脚本,需要有如下条件:
(1)直接写路径以./example的形式执行:
对脚本有rx权限
对脚本所在目录有rx权限
(2)以 sh example 的形式执行
对脚本有r权限
对脚本所在目录有rx权限
4、调试
(1)执行脚本,并显示所有变量的值
sh -x script
执行脚本时会给出执行过程,过程前面会加一个“+”
(2)不执行脚本,只是检查语法的模式,将返回所有语法错误
sh -n script
二、Shell 变量番外(1)
有两类:临时变量 和 永久变量
临时变量: shell程序内部定义的,使用范围仅限于定义它的程序,对其他程序不可见。包括自定义变量、位置变量
自定义变量: 由字母、数字、下划线组成,开头必须是字母或下划线,长度没限制,习惯全大写。赋值有三种情况:
(1)定义时赋值:NUM=1,=两边没有空格;包含多个字符时要用单引号或者双引号引上番外(1)
(2)将一个命令的执行结果赋给变量,TIME=`date`
(3)将一个变量赋给另一个变量,A=$B
位置变量: shell 解释执行用户命令时,将命令行的第一个部分作为命令名,其他部分作为参数。由出现在命令行上的位置确定的参数称为位置参数。
例如:ls -l file1 file2 file3
$0:”ls -l”是命令名
$n:这个程序的第n个参数,n = 1-9,这就是位置变量,位置变量可以直接在脚本里引用,$1,$2,$3 分别指 file1,file2,file3
永久变量: 环境变量,不随 shell 脚本的执行结束而消失。
此外,还有一些特殊变量
变量 | 含义 |
---|---|
$* | 这个程序的所有参数 |
$# | 这个程序的参数个数 |
$$ | 这个程序的PID |
$! | 执行上一个后台命令的PID |
$? | 执行上一个命令的返回值,0代表成功,非0代表不成功 |
read:从键盘读入数据,赋给变量
read USERNAME
expr:对整数型变量进行算术运算,运算符两边是有空格的,否则会被当成一个表达式(字符串)输出
expr 3 + 1 expr `expr 5 + 7` / 3 # 注意,乘号 * 前面要加上转义符 expr 10 \* 4
awk:将文件信息以指定符号分割,然后提取出相应的内容
awk -F域分隔符 '命令'
-F 用来指定域分隔符,最常用的域分隔符是空格和冒号,默认是空格
例子:
(1)检测系统中 UID 为 0 的用户
思路:在 /etc/passwd 文件中,将每一条信息以冒号:分割,若 UID = 0,则输出用户名
awk -F: '$3==0 {print $1}' /etc/passwd
(2)打印输出 PID 为 2441 的命令提示符名称
思路:先获取当前所有进程,再将每一条信息以空格分割,找出 PID 为 2441 的进程,但因其命令提示符名称
ps | awk '$1==2441 {print $4}'
shift 指令:参数左移,每执行一次,参数序列顺次左移一个位置,$#的值减1,移出去的参数不再可用,用于分别处理每个参数
#!/bin/shift if [ $# -le 0 ] then echo "Not enough parameters" exit 0 fi sum=0 while [ $# -gt 0 ] do sum=`expr $sum + $1` shift done echo $sum
四、变量测试语句
用于测试变量是否相等、是否为空、文件类型等
格式: test 测试条件
测试范围:整数、字符串、文件
一般作为 if 语句的测试条件
if test -d $1 then ...,不会单独使用
字符串测试
测试语句 | 通用写法 | 含义 |
---|---|---|
test str1==str2 | [ str1 == str2 ] | 是否相等 |
test str1!=str2 | [ str1 != str2 ] | 是否不相等 |
test str1 | [ str1 ] | 是否不为空 |
test -n str1 | [ -n str1 ] | 是否不为空 |
test -z str1 | [ -z test ] | 是否为空 |
测试语句 | 通用写法 | 含义 |
---|---|---|
test int1 -eq int2 | [ int1 -eq int2 ] | 是否相等 |
test int1 -ge int2 | [ int1 -ge int2 ] | int1是否>=int2 |
test int1 -gt int2 | [ int1 -gt int2 ] | int1是否>int2 |
test int1 -le int2 | [ int1 -le int2 ] | int1是否<=int2 |
test int1 -lt int2 | [ int1 -lt int2 ] | int1是否< int2 |
test int1 -ne int2 | [ int1 -ne int2 ] | 是否不相等 |
测试语句 | 通用写法 | 含义 |
---|---|---|
test -d file | [ -d file ] | 是否是目录 |
test -f file | [ -f file ] | 是否是常规文件(二进制文件) |
test -x file | [ -x file ] | 是否可执行 |
test -r file | [ -r file ] | 是否可读 |
test -w file | [ -w file ] | 是否可写 |
test -a file | [ -a file ] | 是否存在 |
test -s file | [ -s file ] | 文件大小是否非0 |
if
(1) if [ … ] then … fi // fi 为结束符
#!/bin/bash # if...then... echo "please input a number" read NUM if [ $NUM -gt 0 ] then echo "the number > 0" fi
(2) if [ … ] then … else … fi
#!/bin/bash # if...then...else... echo "please input a number" read NUM if [ $NUM -gt 0 ] then echo "the number > 0" else echo "the number <= 0" fi
(3) if [ … ] then … elif … then … fi
#!/bin/bash # if...then...elif... echo "please input a number" read NUM if [ $NUM -gt 0 ] then echo "the number > 0" elif [ $NUM -eq 0 ] then echo "the number = 0" else echo "the number < 0" fi
(4) 多个条件的联合
-a:all,逻辑与
-o:or,逻辑或
#!/bin/bash # -a echo "please input a number" read NUM if [ $NUM -gt -1 -a $NUM -lt 1 ] then echo "-1 < number < 1 " fi # -o echo "please input a string" read STR if [ $STR = "study" -o $STR = "learn" ] then echo " good boy " fi
for
for … done
格式:
for 变量 in 名字表 do 命令列表 done
#!/bin/bash # for...done for DAY in MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY SUNDAY do echo "The day is : $DAY" done
select:把关键字中的每一项做成类似的表单,以交互的方式执行 do 和 done 之间的命令,使用的比较少
格式:
select 变量 in 关键字 do commond done
#!/bin/bash # "select" Usage echo "What is your favorite OS?" select VAR in "Linux" "Unix" "Windows" "Other" do break done echo "You have selected $VAR"
case
case…esac
格式:
case 变量 in 字符串1) commond_1 ;; ... 字符串n) commond_n ;; *) commond_* esac
#!/bin/bash # case echo "******************************" echo "Please select your operation:" echo " Press "C" to Copy" echo " Press "D" to Delete" echo " Press "B" to Backup" echo "******************************" read op case $op in C) echo "your selection is Copy" ;; D) echo "your selection is Delete" ;; B) echo "your selection is Backup" ;; *) echo "invalide selection" esac
while
格式:
while 条件 do commond done
#!/bin/bash # while num=1 while [ $num -le 10 ] do SUM=`expr $num \* $num` echo $SUM num=`expr $num + 1` done
until:类似while循环,不同的是 until 是条件返回值为假时才继续执行
格式:
until 条件 do commond done
#!/bin/bash # "until" usage num=1 until [ $num -eq 10 ] do SUM=`expr $num \* $num` echo $SUM num=`expr $num + 1` done
跳出循环
break:跳出整个循环
continue:跳过本次循环,进行下次循环
函数
functionName() { commond }
函数调用:直接写函数名,不带括号
functionName arg1 ... argn
函数中的变量:均为全局变量,没有局部变量
函数中的参数:调用函数时,可以传递参数,在函数中用 $1、$2 … 来引用
#!/bin/bash # function HELP() { echo "Usage: sh function \$1 \$2 \$3" } if [ $# -ne 3 ] then HELP else echo "thanks for your input, the three arguments is 1 2 3." fi
番外
(1)set 列出所有已定义变量unset ABC 删除一个变量
(2)单引号 vs 双引号
单引号之间的内容会原封不动的指定给变量
双引号里的变量只是占位符,会用实际值替换掉
输入 | 输出 |
---|---|
ABC=’time is $DATE’ | time is $DATE |
ABC=”time is $DATE” | time is Fri Aug 25 06:04:50 PDT 2017 |
(3)几个命令
1)exit 0 退出程序执行,并返回一个返回码,返回码为 0 表示正常退出,非 0 表示非正常退出
2)ps -aux 显示进程启动用户的身份
3)kill -9 强行关闭
相关文章推荐
- Linux 学习笔记_10_Shell编程_2_Shell编程语法(三)
- linux学习笔记四(shell编程二)
- linux基础学习笔记-4-shell编程
- Linux学习笔记(三)---Shell编程
- Linux学习笔记三-Shell编程
- 【Linux学习笔记】32:Shell编程中的变量测试
- 【DAY3】shell编程以及linux的其他设置学习笔记
- Linux 学习笔记_10_Shell编程_1_Shell编程语法
- linux学习笔记-学生信息管理系统(shell编程)
- Linux学习笔记:bash的基础特性之二(shell编程)
- Linux 学习笔记_10_Shell编程_2_Shell编程语法(二)
- 【Linux学习笔记九】Shell编程-正则表达式
- 跟着鸟哥学Linux系列笔记2-第10章VIM学习
- 写得蛮好的linux学习笔记
- 菜鸟的Linux学习笔记之命令alias
- linux 学习笔记(pipe)
- linux学习笔记(5)
- Linux netfilter 学习笔记 之十二 ip层netfilter的NAT模块代码分析
- Linux学习笔记(2)-用户和用户组
- Linux系统学习笔记:信息的表示