Linux shell 脚本编程(概念、变量、语句)

Shell脚本概述:Shell脚本是利用shell的功能所写的一个程序。这个程序是使用纯文本文件,将一些Shell的语法与命令(含外部命令)卸载里面,搭配正则表达式、管道命令与数据重流重定向等功能。

编写流程:需求分析、命令测试、脚本编写、测试调优。

linux@linux:~/test$ vi test.sh
linux@linux:~/test$ bash test.sh
Hello,World
linux@linux:~/test$ source test.sh
Hello,World
linux@linux:~/test$ ./test.sh
bash: ./test.sh: Permission denied
sudo: ./test.sh: command not found
linux@linux:~/test$ chmod 0777 test.sh
linux@linux:~/test$ ./test.sh
Hello,World
linux@linux:~/test$ cat test.sh
#!/bin/bash

echo "Hello,World"

变量介绍:变量来源于数学,是计算机语言中能存储计算结果或能表示值得抽象概念。

变量可以通过变量名访问。在指令式语言中变量通常是可变的。

变量作用:用来存放系统和用户需要的特定参数(值)

变量名:使用固定的名称,由系统预设或用户定义

变量值:能够根据用户设置、系统环境的变化而变化

命名规则:区分大小写、不能使用程序内的保留字和内置变量 、只能使用数字、字母及下划线,且不能以数字开头、使用英文尽量词义通俗易懂。

变量分类:自定义变量:由用户自己定义修改使用。特殊变量(环境变量(由系统维护,用于设置工作环境)、制度变量(用于变量值不允许被修改的情况)、位置变量(通过命令行给脚本程序传递参数)、预定义变量(bash中内置的一类变量,不能直接改变))

用户自定义变量:

  • 双引号:允许通过$符号引用其他变量的值,弱引用,其中变量引用会被替换为变量值
  • 单引号:禁止引用其他变量值,$视为普通字符,强引用,其中变量引用不会替换为变量值,而保持源字符串
  • 反撇号:命令替换,提取命令执行后的输出结果,``and$(....)作用相同
  • echo $a:默认显示数组第一个字符
  • echo ${a[*]}    and    echo ${a[@]} 显示全部字符
  • echo ${a[#*]}    and    echo ${a[#@]}   取出元素个数

  • echo ${a[i]}    取第i个元素   数组赋值a[i]=9

  • unset  a[i]      删除第i个    unset a 删除整个数组 

  • 在底行模式下  noh 取消高亮

  • echo ${a[@]:1:3}    从1 开始打印,打印三个数据元素

  • 只读变量:变量值不允许修改(重新赋值)的情况、无法用unset删除、最快方法重启、readonly

  • 位置变量和预定义变量:

  • $0:表示脚本或命令本身的名称。
  • $1$2$3等:表示命令行传递的参数。例如,$1表示第一个参数,$2表示第二个参数,以此类推。
  • $* 或 $@:表示传递的所有参数。$* 是一个整体

  • $#:表示传递的参数个数。
  • 我们使用 $? 变量来获取上一个命令的退出状态码
  • 常用环境变量:

  • $HOME:当前用户的主目录路径。
  • $USER:当前登录用户的用户名。
  • $PWD:当前工作目录的路径。
  • $PATH:系统搜索可执行文件的路径列表。
  • $LANG:当前系统的语言设置。
  • $HOSTNAME:当前主机的主机名。
  • $SHELL:当前用户的默认shell。

  • Shell语句

  • Shell程序由零或多条shell语句构成。shell语句包括三类:说明性语句、功能性语句、结构性语句。

  • 说明性语句:以#号开始到该行结束,解释不被执行 

  • 功能性语句:

  • read从标注输入读入一行,并赋值给后面的变量,如: read -p "input a number" val   read val1 val2 val3    

  • -p:指定一个提示字符串,作为用户输入前的提示信息。
  • -t:设置一个超时时间(秒),如果用户在指定时间内没有输入,则退出。如果不指定超时时间,read 命令将一直等待用户的输入。
  • -s:使用静默模式,用户输入的内容不会显示在终端上,适用于输入密码等敏感信息。
  • 整数运算: expr   包括加(+)减(-)乘(\*)除(/)求模(%)  expr  &n  \*  6
  • 测试语句: test可测试三种对象(字符串、整数、文件属性)每种测试对象有若干测试操作符
  • 字符串测试:
     [ -z "$name" ]
  • -z string:检查字符串是否为空,如果是空则返回真。
  • -n string:检查字符串是否非空,如果非空则返回真。
  • string1 = string2:检查两个字符串是否相等,如果相等则返回真。
  • string1 != string2:检查两个字符串是否不相等,如果不相等则返回真。
  • -e file:检查文件是否存在,如果文件存在则返回真。
  • -f file:检查文件是否为普通文件,如果是则返回真。
  • -d file:检查文件是否为目录,如果是目录则返回真。
  • -r file:检查文件是否可读,如果可读则返回真。
  • -w file:检查文件是否可写,如果可写则返回真。
  • -x file:检查文件是否可执行,如果可执行则返回真。
  • n1 -eq n2:检查n1是否等于n2,如果相等则返回真。
  • n1 -ne n2:检查n1是否不等于n2,如果不相等则返回真。
  • n1 -gt n2:检查n1是否大于n2,如果是则返回真。
  • n1 -ge n2:检查n1是否大于等于n2,如果是则返回真。
  • n1 -lt n2:检查n1是否小于n2,如果是则返回真。
  • n1 -le n2:检查n1是否小于等于n2,如果是则返回真。
  • 方式1: test $name -eq $1   cheo $?
  • 方式2:   if [ -f $filename ]  then  ..... fi
  • 方式3:if  test  -f  $filename   then .....  fi
  • 返回值0为真,返回值非0为假

分支语句:

  • #!/bin/bash 
    
    A=`grep "^linux:" /etc/passwd | wc -l`
    if [ $A -eq 1 ]
    then
    	echo "exist"
    else
    	echo "not exist"
    fi
    

    多路分支语句: case...esac 

  • case    字符串变量    in                                                                                                                           模式1)                                                                                                                                                命令表1                                                                                                                                             ;;                                                                                                                                    esac

    #!/bin/bash 
    
    #study contral
    #80-100 A
    #60-79  B
    #0-59   C
    
    read -p "Please input your score:" val
    
    if [ $val -gt 100  -o $val -lt 0 ]
    then
    	echo "input error val"
    	exit
    fi
    
    A=`expr $val / 10`
    
    case $val in 
    	8 | 9 | 10)
    		echo "A"
    		;;
    	6 | 7 )
    		echo "B"
    		;;
    	*)
    		echo "C"
    		;;
    
    

    循环语句:

  • for用法     for  变量名  in   单词表                                                                                                                   do                                                                                                                                                             命令表                                                                                                                             done

  • for 变量依次取单词表中的各个单词,每取依次单词,就执行依次循环体中的命令。循环次数由单词表中的单词数确定。命令表中的命令可以是一条,也可以是由分好或换行符分开的多条。如果单词表是命令行上的所有位置参数时,可以在for语句中省略“in  单词表”

  • while用法    while   命令表达式                                                                                                                             do                                                                                                                                                          命令表                                                                                                                                done

  • while语句首先测试其后的命令或表达式的值,如果为真,就执行依次循环体中的命令,然后再测试改命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。

  • while语句的退出状态为命令表中被执行的最后一条命令的退出状态

  • 循环控制语句: break n跳出n层循环    continue  语句则马上转到最近一层循环语句的下一轮循环上,continue  n  则转到最近n层循环语句的下一轮循环上。

  • 函数定义: function name(){

statements 

[return value]

}

  • function 是关键字专门定义函数 name是函数名 statements是函数要执行的代码  return value是返回值,这一部分可以不写
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值