Linux从入门到精通(十二)——shell编程 下

简介: Linux从入门到精通(十二)——shell编程 下

4.5 流程控制语句

和其他高级程序设计语言一样,Shell提 供了用来控制程序和执行流程的命令,包括条件分支和循环结构,用户可以用这些命令创建复 杂的程序。

与传统语言不同的是,Shell用于指定条件值的不是布尔运算式, 而是命令和字符串。

4.5.1 If

if [条件表达式]
  then
    语句序列
fi
# 如果你喜欢,也可以将 then 和 if 写在一行:
if  [条件表达式];  then
    语句序列
fi
# -------------------------------------------------------------------------
if [条件表达式]; then
  语句序列1
else
  语句序列2
fi
# -------------------------------------------------------------------------
if [条件表达式1]; then
  语句序列1
elif [条件表达式2]; then
  语句序列2
...
else
  语句序列n
fi

4.5.2 case

case var in
  表达式1)
    ...
    ;; 
  表达式2)
    ...
    ;;
  表达式3)
    ...
    ;;
    *) # 用通配符*来处理无匹配的情况,相当于其他语言中的default
      ...
esac

【例子】

[root@VM-24-17-centos shellstudy]# vim casetest.sh
#!/bin/bash
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 "yourl selection 1s backup" ;;
        *)
                echo "invalide selection"
esac
[root@VM-24-17-centos shellstudy]# chmod u+x casetest.sh 
[root@VM-24-17-centos shellstudy]# ./casetest.sh 
*********************************
please select your operation:
press C to copy
press D to delete
press B to backup
*********************************
C
your selection is copy

4.6 循环结构

在Shell程序中可以使用循环控制语句。

当循环次数已知或确定时,可以使用for循环语句来多次执行一条或一组命令,循环体由语句括号do和done来限定。

根据判断条件是否为真,使用while语句和until语句实现循环操作。

如果需要在未达到循环结束条件时强制跳出循环,通过break和continue实现。

4.6.1 for

  1. for语法1:
for 变量名 in 参数列表
  do
    命令列表
  done

将"参数列表"中的元素依次赋给"变量名“,在每次赋值后执行"命令列表”,"参数列表"表示"变量名"的取值范围。

【例子】

[root@VM-24-17-centos shellstudy]# vim for.sh
#!/bin/bash
for day in sunday monday tuesday wndnesday thursday friday saturday
do      
        echo "this is : ${day}"
done 
[root@VM-24-17-centos shellstudy]# chmod u+x for.sh 
[root@VM-24-17-centos shellstudy]# ./for.sh 
this is : sunday
this is : monday
this is : tuesday
this is : wndnesday
this is : thursday
this is : friday
this is : saturday

for语法2:

这种和我们平时学的高级语言中的for循环差不多。

for ((表达式1; 表达式2; 表达式3)) 
do 
  语句序列
done

表达式1: 赋值语句,循环结构的初始部分,为循环变量赋初值;

表达式2:条件语句,循环结构的循环条件;

表达式3:迭代语句,通常使用 ++ 或 – 运算符,循环结构的迭代部分,通常用来修改循环变量的值;

【例子】

[root@VM-24-17-centos shellstudy]# vim for2.sh
#!/bin/bash
for ((i=0; i <= 5; i++))
do      
        echo "${i}"
done    
for ((i=1,j=10; i <= 5; i++,j=j+5))
do      
        echo "Number ${i}: ${j}"
done 
[root@VM-24-17-centos shellstudy]# chmod u+x  for2.sh
[root@VM-24-17-centos shellstudy]# ./for2.sh 
0
1
2
3
4
5
Number 1: 10
Number 2: 15
Number 3: 20
Number 4: 25
Number 5: 30

4.6.2 while

语法:

while [条件表达式]
do 
  命令列表
done

循环执行“命令列表”中的命令,直至“条件表达式”的值为假。

4.6.3 until

语法:

until [条件表达式]
do 
  命令列表
done

循环执行“命令列表”中的命令,直至“条件表达式”的值为真。

4.6.4 break 和 continue

  • break:终止当前循环
  • continue:忽略本次循环continue之后的语句,进入下一轮循环。

4.7 函数

4.7.1 函数的定义

# 形式1:
function 函数名 {
  函数体
}
# 形式2:
函数名(){  
  函数体
}

注意:

  1. 第一种形式里,函数名和大括号之间要有空格;
[root@VM-24-17-centos shellstudy]# vim func1.sh
#!/bin/bash
function testSum{
        let sum=3+4 # 注意,运算符两侧不要有空格
        echo "3+4=${sum}"
}
testSum
[root@VM-24-17-centos shellstudy]# chmod u+x func1.sh
[root@VM-24-17-centos shellstudy]# ./func1.sh
./func1.sh: line 3: syntax error near unexpected to ken `let'
./func1.sh: line 3: `        let sum=3+4 '

可以看到并没有像想象中一样运行成功,而是报错了,意思有语法错误,在第三行let的地方(4.3 数值计算 有说let的使用),可是我们发现并没有错误, 那么我们就要看一下它周边的代码有没有问题,问题就出在空格:

function testSum{ # 少了个空格
function testSum { 

4.7.2 函数调用

函数名 #注意不需要括号
# 如果需要参数
函数名 参数1 参数2 ...

注意:

  1. 调用函数时传递的参数,在函数体中可以通过位置变量$1 $2 ...使用;
[root@VM-24-17-centos shellstudy]# vim func1.sh
#!/bin/bash
testSum(){
        if [ $# -ne 2 ];then
                echo "not enough parameters!"
                echo "example ./func1.sh 1 2"
                exit 0 # 正常退出
        fi
        let sum=$1+$2
        echo "$1+$2=${sum}"
}
testSum $1 $2 # 注意,这里不要忘记把参数传递给函数
[root@VM-24-17-centos shellstudy]# ./func1.sh
not enough parameters!
example ./func1.sh 1 2
[root@VM-24-17-centos shellstudy]# ./func1.sh 1 2
1+2=3

4.7.3 返回值

[root@VM-24-17-centos shellstudy]# vim func1.sh
#!/bin/bash
testSum(){
        if [ $# -ne 2 ];then
                echo "not enough parameters!"
                echo "example ./func1.sh 1 2"
                exit 0 # 退出
        fi
        let sum=$1+$2
        return ${sum}
}
testSum $1 $2

如何访问到返回值:

  1. 通过$?(3.3 预定义变量 有说)访问:
[root@VM-24-17-centos shellstudy]# vim func1.sh
...
echo "$?"
[root@VM-24-17-centos shellstudy]# ./func1.sh 1 2
3
  1. 注意,如果通过这种方式,在调用函数和访问返回值之间不要出现其他语句

4.7.4 递归

实例:阶乘

#!/bin/bash
function fac {
        i=$1
        if [ ${i} -eq 1 ];then
                echo 1
        else
                let j=${i}-1
                k=`fac ${j}`
                echo `expr ${i} \* ${k}`
        fi
}
while true
do
        read -p "please input an interger('q' to quit): " num
        if [ ${num} = 'q' ];then
                break
        fi
        rtn=`fac ${num}`
        echo "answer is ${rtn}"
done

注意:

rtn=`fac ${num}`
  1. 并不是我们以为的那种获取函数返回值,echo xxx是输出到标准输出,fac函数通过echo将结果输出到标准输出,然后最终赋值给rtn的,``是返回命令的执行结果;

4.8 数组

  1. 定义数组
declear -a 变量名
#或者
变量名=(val1 val2 val3 ...)
# 或者
变量名=([下标1]=val1 [下标2]=val2 ...) #这个并不影响你获取的数组长度,不会因为你arr1=([10]=1),数组就长10,数组长度是你数组的元素个数。
  1. 初始化
数组名[index]=值
  1. 访问数组元素:
${数组名[${下标}]}
  1. 访问数组长度(数组元素个数)
${#数组名[*]}

【例子1】

[root@VM-24-17-centos shellstudy]# vim arr.sh
#!/bin/bash
arr1=(1 2 3 4)
echo "arr1=[${arr1[*]}]"
echo "len(arr1)=${#arr1[*]}"
for ((i=0; i < ${#arr1[*]}; i++))
do
        echo -n -e "${arr1[${i}]}\t"
done
echo ""
[root@VM-24-17-centos shellstudy]# chmod u+x arr.sh
[root@VM-24-17-centos shellstudy]# ./arr.sh 
arr1=[1 2 3 4]
len(arr1)=4
1 2 3 4 

【例子2】

[root@VM-24-17-centos shellstudy]# vim arr2.sh
#!/bin/bash
arr1=([3]=1 [4]=2 [5]=3 [6]=4)
echo "arr1=[${arr1[*]}]"
echo "len(arr1)=${#arr1[*]}"
echo "方法1"
for ((i=0; i < ${#arr1[*]}; i++))
do
        echo -n -e "${arr1[${i}]}\t"
done
echo ""
echo "方法2"
for var in ${arr1[*]}
do
        echo -n -e "${var}\t"
done
echo ""
[root@VM-24-17-centos shellstudy]# chmod u+x arr2.sh
[root@VM-24-17-centos shellstudy]# ./arr2.sh 
arr1=[1 2 3 4]
len(arr1)=4
方法1
      1 
方法2
1 2 3 4 

注意:

下标从0开始

数组成员不必一定要连贯或连续的;

数组的一部分成员允许不被初始化;

数组中空缺元素是允许的;

5. 补充

查看登录用户信息:

who am i :当前登录用户,信息较为全面

whoami: 只显示登录用户名

who:较为全面的所有登录用户信息

w:更全面的所有登录用户信息

相关文章
|
2月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
385 9
|
2月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
253 2
|
2月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
4月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
464 1
|
6月前
|
安全 算法 Ubuntu
Linux(openssl)环境:编程控制让证书自签的技巧。
总结:在Linux环境中,OpenSSL是一个非常实用的工具,可以帮助我们轻松地生成自签名证书。通过上述三个简单步骤,即可为内部网络、测试环境或开发环境创建自签名证书。但在公共访问场景下,建议购买经过权威认证机构签发的证书,以避免安全警告。
289 13
|
6月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
178 4
|
6月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
358 3
|
7月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
588 25
|
7月前
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
143 18
|
5月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
238 60