Linux5--shell编程基础

xiaoxiao2025-05-26  17

文章目录

shell 编程基础第一个脚本变量运算符流程控制语句三元运算符read:人机交互界面,程序中用来获取用户手动输入的值shell的自定义函数

shell 编程基础

第一个脚本

打印helloworld vi hw.sh ------------------------- #! /bin/bash echo helloworld ------------------------- #! /bin/bash : 代表使用哪种解析器来解析脚本文件 执行方式 1)source 或者. 空格 文件名--将脚本程序拉取到当前进程空间执行 2)bash + 脚本文件名--脚本程序在当前进程的子进程执行 3)给脚本赋予可执行权限,进行执行--脚本程序在当前进程的子进程执行

变量

变量分类 : 1.系统变量 2.自定义变量 3.只读变量 : readonly 变量,一旦声明,变量不能更改,不能撤销 注意:定义变量的时候不能有空格 查看变量 : set : 查看所有变量 A = 25 : 查看单个变量 使用变量 : A = 'helloWord' set echo "$As is strong" # 无法输出变量A ,查找的是AS这个变量 echo "$A is strong" echo "${A} is strong" # 将A单独作为一个整体 echo '${A} is strong' #单引号会将变量脱意,双引号仅将空格脱意 撤销变量 : unset 变量 1.unset A 2.不能撤销只读变量 程序的执行空间 vi a.sh -------------------- #! /bin/bash a="a is in a.sh " -------------------- echo $a vi b.sh -------------------- #! /bin/bash b="b is in b.sh " echo $b echo $a -------------------- 修改a.sh,使用export变量提升a为全局变量,也就是a.sh的子进程都能访问a vi a.sh -------------------- #! /bin/bash export="a is in a.sh " echo $a /root/shells/b.sh -------------------- echo $a vi b.sh -------------------- #! /bin/bash b="b is in b.sh " echo $b echo $a -------------------- 总结: 1.a.sh总直接调用b.sh,会让b.sh在a.sh的进程空间创建一个子进程创建一个空间去执行 2.子空间中只能访问父空间中用export提升过的变量 3.一个shell进程无法将自己定义的变量提升到父进程空间中 4.source 或者 "." 空格执行脚本时,或让脚本在调用者所在的进程空间执行 变量赋值: 实例:把ls取出的内容赋值给一个变量,执行一个 或脚本,将执行结果赋值给变量.执行结果,执行之前不确定,无法赋值,我们就使用反引号赋值 反引号赋值 B=`ls -l` C=`date` d=$(ls -l) 与反引号赋值效果一样 特殊变量: $? : 表示上一个命令返回的状态 (0-255),不同的错误返回的状态码不一样,返回0代表成功 $$ : 表示当前的进程编号 $0 : 表示当前脚本名称 $n : 表示第n个参数(执行脚本有可能从外面获取参数 touch 1.txt 2.txt) vi a.sh -------------------- #! /bin/bash export="a is in a.sh " echo $a echo $0 echo $$ echo $1 echo $10 echo ${10} /root/shells/b.sh -------------------- echo $a vi b.sh -------------------- #! /bin/bash b="b is in b.sh " echo $0 echo $$ echo $b echo $a -------------------- 当n为0时输出脚本名称,n>9的时候,要使用{}括起来,例如like ${10} $# : 表示参数的个数,常用语循环 vi e.sh ------------------- #! /bin/bash echo $# echo $1 -------------------- bash e.sh 1 2 3 4 6 输出结果: ------------- 5 1 ---------------- $@ : 参数列表 $* : 参数列表 ,当用双引号括起来时,$@和$*是有区别的,$"@"会将各个参数分开.$"*"将所有参数当做一个整体 不加双引号时 vi e.sh ------------------- #! /bin/bash echo $# echo $1 echo $@ echo $* -------------------- bash e.sh 1 2 3 4 6 输出结果: ------------- 5 1 1 2 3 4 6 1 2 3 4 6 ---------------- ************************* 1)使用$@ vi f.sh ------------------- #! /bin/bash for i in "$@" do echo $i done echo "finsh" -------------------- bash e.sh 1 2 3 4 5 输出结果: ------------- 1 2 3 4 5 finsh ---------------- 2)使用$* vi f.sh ------------------- #! /bin/bash for i in "$*" do echo $i done echo "finsh" -------------------- bash e.sh 1 2 3 4 5 输出结果: ------------- 1 2 3 4 5 finsh ----------------

运算符

1.使用expr 格式 : expt + m + n 或者使用$(m+n) 注意 : expt中间必须有空格 练习 : 计算(2+3)*4 方法一:分步 step1:s=`expt 2 + 3` step2:s=`expt $s \* 4` -------> s=`expr \`expr 2 + 3\` \* 4` echo $s 输出结果: ------------------ 20 ------------------ 方法二:用() -------> 当需要取得计算结果时,需要用$引用 s=$(((2+3)*4)) echo $s 输出结果: ------------------ 20 ------------------ 2.使用let i=1 let i++ let i=i+2 echo $i 3.判断运算符 基本运算符 = : 等于,相当于java中的== != : 不等于 -z : 表示判断字符长度是否为0,为0则返回true -n : 表示判断字符长度是否为0,不为0则返回true 整数比较: -lt : 小于 -le : 小于等于 -gt : 大于 -ge : 大于等于 -eq : 等于 -ne : 不等于 \> \>= \< \<= = 文件比较: -r : 读权限 -w : 写权限 -x : 执行权限 -f : 文件存在并且是一个常规文件 -s : 文件存在且不为空 -e : 判断文件是否存在 -d : 判断是否为目录 -b : 文件存在,并且是一个设备 -L : 判断是否是一个连接

流程控制语句

1.分支 1)基本结构化命令 if-then语句格式 if [ condition ] then command command ... fi -----------> year=1979 if [ $year -eq 1979 ] then echo "$year年" let year-- echo "$year年" fi 运行结果: ------------ 1979年 1978年 ------------ 2)基本结构化命令 if-then-else语句格式 if [ condition ] then command command ... else command command ... fi -----------> year=1979;if [ $year -lt 1979 ];then echo "$year年"; else echo "$year年 is new"; fi 运行结果: ----------- 1978年 ----------- 3)嵌套if if [ condition ] then command command ... elif [ condition ] command command ... else command command ... fi if [ $year -eq 1979 ]; then echo "$year年 老人画了个圈"; elif [ $year -gt 1979 ] ; then echo "$year年 is new"; else echo "$year年"; fi 4)条件判断基本控制语法注意点: condition前后必须由空格,非空返回true,可以使用$?,内部的=前后要有空格,否则结果有区别 if [ a=b ];then echo "ok";else echo "nook" ;fi ##b赋值给a if [ a = b ];then echo "ok";else echo "nook" ;fi ##相当于 == 做判断 2.while循环 格式: while [ expression ] do command done 实例: vi shile.sh ------------------------ #!/bin/bash read -p "请输入一个数字:" num while [ $num -lt 10 ] do echo "$num" let num++ done ------------------------ vi while.sh ------------------------ #!/bin/bash read -p "请输入一个数字:" num while((num<=5)) do echo "$num" let num++ done ---------------------- case语句: case 值 in 模式1) command command ... 模式2) command command ... esac 实例: vi case.sh ------------------------ #!/bin/bash while true(这里直接写冒号也代表死循环) do read -p "请输入一个1-5之间的数字" num case $num in 1|2|3) echo "您输入的数字是$num" break ;; 4|5) echo "您输入的数字是$num" break ;; *) echo "您输入的数字是$num" continue esac done --------------------------- 3.for循环 第一种写法 for i in 1 2 3 4 do echo $i done 第二种写法 for((i=0;i <= 5;i++)) do echo "$i" done

三元运算符

格式:[ condition ] && echo "ok" || echo "nook" condition ? 0 : 1 当条件满足时,执行&&后面的语句 当条件不满足时,执行||后面的语句 条件判断组合 [] -a -o 一起使用 [[]] && || 一起使用 练习: if [ a = b -a b = c ];then echo "ok";else echo "nook"; fi 结果: ------------ nook ------------

read:人机交互界面,程序中用来获取用户手动输入的值

实例: vi read.sh -------------- #! /bin/bash echo "姓名:" read value echo $value -------------- vi read.sh -------------- #! /bin/bash read -p "姓名:" name echo $name -------------- 注意: -p 提示语句不换行 -n 限定等待时间 -t 限制等待时间

shell的自定义函数

格式: [function] 函数名称() { action; [return int;] ##0-255 } 实例: vi funtion.sh*******不带返回值,直接打印 -------------------------------- #!/bin/bash param1=$1 param2=$2 function sum() { returnValue=$((param1+param2)) echo $returnValue } sum param1 param2 -------------------------------- vi function2.sh*******带返回值 -------------------------------- #!/bin/bash param1=$1 param2=$2 function sum() { returnValue=$((param1+param2)) return $returnValue } sum param1 param2 echo "$?" ----------------------------------- 注意: 1.参数的返回可以显示加:return返回,返回的是0-155之间的数 2.如果不加return,函数将以最后一条命令结果作为返回值 3.shell中通过return返回是有限制的,最大值是255,超过255从0开始
转载请注明原文地址: https://www.6miu.com/read-5030720.html

最新回复(0)