shell编程

您所在的位置:网站首页 Linux运行代码期待一元表达式 shell编程

shell编程

2024-07-11 00:57| 来源: 网络整理| 查看: 265

shell编程 概述

Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核

image-20211220095930693

Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。

注:Centos默认解析器时bash

shell脚本入门 #!/root/bash echo "hello Word!!"

执行:

**方式一:**采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)**方式二:**采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x) 变量

系统变量:使用工具查看所属位置

H O M E 、 HOME、 HOME、PWD、 S H E L L 、 SHELL、 SHELL、USER等

自定义变量

定义变量 变量名=变量值。注:定义变量不能有空格,做特殊处理,一切皆字符串

撤销变量 unset 变量名

静态变量 readonly D=10 注:不能直接更改,也不能直接撤销,除非直接重新加载

变量如果有空格,需要使用单引号或双引号

提升全局变量,使用export,可以让其他shell使用

[root@pier shells]# export B [root@pier shells]# ./helloworld.sh helloworld 10

变量规则: 和Java类似 环境变量名建议大写

单引号双引号,基本上类似于编程语言中的引用字符串

区别在于单引号’ '内剥夺所有字符的特殊含义,所有字符都是单纯的字符串而没有特殊功能,比如$取参数等命令都是无效的

而双引号" "中除了字符串,特殊字符是没有被转义的,$等特殊字符一样可以使用其功能。

反引号``是命令替换,通常用于把命令输出结果传给入变量中,类似变量后$=(命令)如:image-20211217100552965

特殊变量

$n (功能描述,n为数字,%0代表该脚本名称,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10}) 例: vim param.sh #!/bin/bash echo '=============$n============' echo $0 echo $1 echo $2 :wq

执行

[root@pier shells]# ./param.sh a b =============$n============ ./param.sh a b $# 打印执行脚本时传入变量的个数$* / $@ 打印传入变量$? 判断上一次命令是否正确0为true 非0为false 运算符

加上(())或者[]就可以正常运行了

条件判断

基础语法

test condition

[ condition ](注意判别式前后一定要有空格)

常用判断条件

1、两个整数之间的判断 比较符号来源记忆大于-gtgreater than大于等于-gegrreater equal小于-ltless than小于等于-leless equal等于-eqequal不等于-nenot equal

实操:

判断2和3的大小:

[root@pier shells]# [ 2 -gt 3 ] [root@pier shells]# echo $? 1 [root@pier shells]# [ 2 -lt 3 ] [root@pier shells]# echo $? 0 2、字符串之间的比较 ==

实操,判断字符串s="== n = = " 和 s 1 = ′ = = n=="和s1='== n=="和s1=′==n=='是否一致

[root@pier shells]# s="==$n==" [root@pier shells]# s1='==$n==' [root@pier shells]# [ s1==s ] [root@pier shells]# echo $? 0 [root@pier shells]# echo '==$n==' ==$n== [root@pier shells]# echo "==$n==" ====

这里就让我不解了,于是,我们找找为什么会出现相同的呢?

我貌似有一点点的傻,这个参数,在赋值的时候,仅仅是一个字符串,我们在判断的时候,也只是判断这两个字符串是否一样,二并没有去执行,因此,在下面的echo输出结果不一致,二在比较s和s1两个字符串是判断为正确。

3、按照文件权限进行判断 -r 有读的权限(read)-w 有写的权限(write)-x 有执行的权限 (execute)

实操:

[root@pier shells]# test -x 200 [root@pier shells]# echo $? 1 [root@pier shells]# ll 总用量 8 -rw-r--r--. 1 root root 0 12月 17 10:39 200 4、按照文件类型进行判断 -f文件存在并且是一个常见的文件(file)-e 文件存在(existence)-d 文件存在并且是一个目录(directory)

实操:判断文件abc是否存在,abd呢?

[root@pier shells]# [ -e abc ] [root@pier shells]# echo $? 0 [root@pier shells]# ll 总用量 8 -rw-r--r--. 1 root root 0 12月 17 10:39 200 drwxr-xr-x. 2 root root 6 12月 17 15:20 abc -rwxr--r--. 1 root root 40 12月 17 09:40 helloworld.sh -rwxrwxr--. 1 root root 151 12月 17 10:29 param.sh [root@pier shells]# [ -e abd ] [root@pier shells]# echo $? 1 5、多重判断 || && 运算,和Java类似

实操:

[root@pier shells]# [ 100 -lt 200 ] && [ 100 -gt 50 ] [root@pier shells]# echo $? 0 [root@pier shells]# [ 100 -lt 200 ] && [ 100 -lt 50 ] [root@pier shells]# echo $? 1 [root@pier shells]# [ 100 -gt 200 ] && [ 100 -gt 50 ] [root@pier shells]# echo $? 1 [root@pier shells]# [ 100 -gt 200 ] && [ 100 -gt 50 ] [root@pier shells]# echo $? 1 [root@pier shells]# [ 100 -gt 200 ] || [ 100 -gt 50 ] [root@pier shells]# echo $? 0 流程控制

流程控制的作用: 继续运行位在不同位置的一段指令(无条件分支指令)。 若特定条件成立时,运行一段指令,例如C语言的switch指令,是一种有条件分支指令。 运行一段指令若干次,直到特定条件成立为止,例如C语言的for指令,仍然可视为一种有条件分支指令。 运行位于不同位置的一段指令,但完成后会继续运行原来要运行的指令,包括子程序、协程(coroutine)及延续性(continuation)。 停止程序,不运行任何指令(无条件的终止)。

if判断 基本语法 #!/bin/bash if [ condition1 ]#这是开始语句 then 语句1 elif [ condition2 ] then 语句2 · · · else echo 语句n fi#这是结束语句的标志

实例:

#!/bin/bash #if测试脚本 if [ $1 -eq 1 ] then echo "大数据,我来了!!!" elif [ $1 -eq 2 ] then echo "大数据,pier又回归!!!" else echo "都不留爷,pier要离开了!" fi

执行:

[root@pier shells]# ./if.sh 2 大数据,pier又回归!!! [root@pier shells]# vim if.sh [root@pier shells]# ./if.sh 2 大数据,pier又回归!!! [root@pier shells]# ./if.sh 1 大数据,我来了!!! [root@pier shells]# ./if.sh 3 都不留爷,pier要离开了! [root@pier shells]# ./if.sh ./if.sh: 第 3 行:[: -eq: 期待一元表达式 ./if.sh: 第 6 行:[: -eq: 期待一元表达式 都不留爷,pier要离开了!

这里我们发现这个他居然有错误提示,于是发现了,报错的两行正好是我们需要传入参数的两行,所以,我们就可以在if判断外边再加一个判断参数不为空的函数就可以了。

if [ $# -lt 1 ] then echo "请传参!" exit fi case分支 #!/bin/bash case $1 in "1") echo "这是1分支! ! !" ;;#这个相当于break "2") echo "这是2分支!!!" ;; echo "default结束了!!!" ;; esac for 循环 for(( 初始值;循环控制条件;变量变化 )) do 程序语句 done 注:在循环控制条件中使用>


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3