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

一、学命令以前的基础知识

1、shell 脚本的结构
首先给出一个示例

#!/bin/bash
# —————————————————————
# This script is used to understand the shell structure
# ————————————————————
echo "We are currently in the following directory."
/bin/pwd

执行结果:
1

正如上面的示例代码所示,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 

执行脚本时会给出执行过程,过程前面会加一个“+”
sh-x

(2)不执行脚本,只是检查语法的模式,将返回所有语法错误

sh -n script

sh-n

二、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 

expr

  • awk:将文件信息以指定符号分割,然后提取出相应的内容
awk -F域分隔符 '命令'

-F 用来指定域分隔符,最常用的域分隔符是空格和冒号,默认是空格
例子:
(1)检测系统中 UID 为 0 的用户
思路:在 /etc/passwd 文件中,将每一条信息以冒号:分割,若 UID = 0,则输出用户名

awk -F: '$3==0 {print $1}' /etc/passwd

awk-F

(2)打印输出 PID 为 2441 的命令提示符名称
思路:先获取当前所有进程,再将每一条信息以空格分割,找出 PID 为 2441 的进程,但因其命令提示符名称

ps | awk '$1==2441 {print $4}'

awk

  • 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

shift

四、变量测试语句

用于测试变量是否相等、是否为空、文件类型等
格式: 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

if-then

(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

if-then-else

(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

if-else-elif

(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

-a-o

  • 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

for

  • 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"

select

  • 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

case

  • 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

while

  • 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

until

  • 跳出循环
    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

function

番外

(1)set 列出所有已定义变量
unset ABC 删除一个变量
set
unset

(2)单引号 vs 双引号

  • 单引号之间的内容会原封不动的指定给变量
  • 双引号里的变量只是占位符,会用实际值替换掉
输入 输出
ABC=’time is $DATE’ time is $DATE
ABC=”time is $DATE” time is Fri Aug 25 06:04:50 PDT 2017

2

(3)几个命令
1)exit 0 退出程序执行,并返回一个返回码,返回码为 0 表示正常退出,非 0 表示非正常退出
2)ps -aux 显示进程启动用户的身份
3)kill -9 强行关闭

发布了44 篇原创文章 · 获赞 82 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/wenyun_kang/article/details/77585333