您的位置:首页 > 运维架构 > Shell

Linux学习——Shell编程学习笔记

2017-08-25 19:23 826 查看
一、学命令以前的基础知识

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代表不成功
三、shell命令

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 强行关闭
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell linux 脚本