shell语法【Linux第三课(二)】(2)

简介: shell语法【Linux第三课(二)】(2)

3.12循环语句

for…in…do…done


命令格式:

for var in val1 val2 val3
do
    语句1
    语句2
     ...
done

示例1,输出a 2 cc,每个元素一行:


for i in a 2 cc
do
    echo $i
done

示例2,输出当前路径下的所有文件名,每个文件名一行:


for file in `ls`
do
    echo $file
done

示例3,输出1-10


for i in $(seq 1 10)
do
    echo $i
done

示例4,使用{1…10} 或者 {a…z}


for i in {a..z}
do
    echo $i
done

for ((…;…;…)) do…done


命令格式:


for ((expression; condition; expression))
do
    语句1
    语句2
done

示例,输出1-10,每个数占一行:


for ((i=1; i<=10; i++))
do
    echo $i
done

while…do…done循环


命令格式:


while condition
do
    语句1
    语句2
    ...
done

示例,文件结束符为Ctrl+d,输入文件结束符后read指令返回false。


while read name
do
    echo $name
done

until…do…done循环


当条件为真时结束。


命令格式:


until condition
do
    语句1
    语句2
    ...
done

示例,当用户输入yes或者YES时结束,否则一直等待读入。


until [ "${word}" == "yes" ] || [ "${word}" == "YES" ]
do
    read -p "Please input yes/YES to stop this program: " word
done

break命令


跳出当前一层循环,注意与C/C++不同的是:break不能跳出case语句。


示例


while read name
do
    for ((i=1;i<=10;i++))
    do
        case $i in
            8)
                break
                ;;
            *)
                echo $i
                ;;
        esac
    done
done

该示例每读入非EOF的字符串,会输出一遍1-7。


该程序可以输入Ctrl+d文件结束符来结束,也可以直接用Ctrl+c杀掉该进程。


continue命令


跳出当前循环。


示例:


for ((i=1;i<=10;i++))
do
    if [ `expr $i % 2` -eq 0 ]
    then
        continue
    fi
    echo $i
done

该程序输出1-10中的所有奇数。


死循环的处理方式


如果AC Terminal可以打开该程序,则输入Ctrl+c即可。


否则可以直接关闭进程:


使用top命令找到进程的PID


输入kill -9 PID即可关掉此进程


3.13 函数

bash中的函数类似于C/C++中的函数,但return的返回值与C/C++不同,返回的是exit code,取值为0-255,0表示正常结束。


如果想获取函数的输出结果,可以通过echo输出到stdout中,然后通过$(function_name)来获取stdout中的结果。


函数的return值可以通过$?来获取。


命令格式:


[function] func_name() {  # function关键字可以省略
    语句1
    语句2
    ...
}

不获取 return值和stdout值


示例


func() {
    name=yxc
    echo "Hello $name"
}
func

输出结果:


Hello yxc

获取 return值和stdout值


不写return时,默认return 0。


示例


func() {
    name=yxc
    echo "Hello $name"
    return 123
}
output=$(func)
ret=$?
echo "output = $output"
echo "return = $ret"

输出结果:


output = Hello yxc
return = 123

函数的输入参数


在函数内,$1表示第一个输入参数,$2表示第二个输入参数,依此类推。


注意:函数内的$0仍然是文件名,而不是函数名。


示例:


func() {  # 递归计算 $1 + ($1 - 1) + ($1 - 2) + ... + 0
    word=""
    while [ "${word}" != 'y' ] && [ "${word}" != 'n' ]
    do
        read -p "要进入func($1)函数吗?请输入y/n:" word
    done
    if [ "$word" == 'n' ]
    then
        echo 0
        return 0
    fi  
    if [ $1 -le 0 ] 
    then
        echo 0
        return 0
    fi  
    sum=$(func $(expr $1 - 1))
    echo $(expr $sum + $1)
}
echo $(func 10)

输出结果:


55

函数内的局部变量


可以在函数内定义局部变量,作用范围仅在当前函数内。


可以在递归函数中定义局部变量。


命令格式:


local 变量名=变量值

例如:


#! /bin/bash
func() {
    local name=yxc
    echo $name
}
func
echo $name

输出结果:


yxc

第一行为函数内的name变量,第二行为函数外调用name变量,会发现此时该变量不存在。


3.14 exit命令

exit命令用来退出当前shell进程,并返回一个退出状态;使用$?可以接收这个退出状态。


exit命令可以接受一个整数值作为参数,代表退出状态。如果不指定,默认状态值是 0。


exit退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。


示例:


创建脚本test.sh,内容如下:


#! /bin/bash
if [ $# -ne 1 ]  # 如果传入参数个数等于1,则正常退出;否则非正常退出。
then
    echo "arguments not valid"
    exit 1
else
    echo "arguments valid"
    exit 0
fi

执行该脚本:


acs@9e0ebfcd82d7:~$ chmod +x test.sh 
acs@9e0ebfcd82d7:~$ ./test.sh acwing
arguments valid
acs@9e0ebfcd82d7:~$ echo $?  # 传入一个参数,则正常退出,exit code为0
0
acs@9e0ebfcd82d7:~$ ./test.sh 
arguments not valid
acs@9e0ebfcd82d7:~$ echo $?  # 传入参数个数不是1,则非正常退出,exit code为1

3.15 文件重定向

每个进程默认打开3个文件描述符:


stdin标准输入,从命令行读取数据,文件描述符为0

stdout标准输出,向命令行输出数据,文件描述符为1

stderr标准错误输出,向命令行输出数据,文件描述符为2

可以用文件重定向将这三个文件重定向到其他文件中。


重定向命令列表


command > file 将stdout重定向到file中

command < file 将stdin重定向到file中

command >> file 将stdout以追加方式重定向到file中

command n> file 将文件描述符n重定向到file中

command n>> file 将文件描述符n以追加方式重定向到file中

输入和输出重定向

echo -e "Hello \c" > output.txt  # 将stdout重定向到output.txt中
echo "World" >> output.txt  # 将字符串追加到output.txt中
read str < output.txt  # 从output.txt中读取字符串
echo $str  # 输出结果:Hello World

同时重定向stdin和stdout


创建bash脚本:

#! /bin/bash
read a
read b
echo $(expr "$a" + "$b")

创建input.txt,里面的内容为:

3
4

执行命令:

acs@9e0ebfcd82d7:~$ chmod +x test.sh  # 添加可执行权限
acs@9e0ebfcd82d7:~$ ./test.sh < input.txt > output.txt  # 从input.txt中读取内容,将输出写入output.txt中
acs@9e0ebfcd82d7:~$ cat output.txt  # 查看output.txt中的内容
7

3.16 引入外部脚本

类似于C/C++中的include操作,bash也可以引入其他文件中的代码。


语法格式:

. filename  # 注意点和文件名之间有一个空格
source filename

示例


创建test1.sh,内容为:

#! /bin/bash
name=yxc  # 定义变量name

然后创建test2.sh,内容为:

#! /bin/bash
source test1.sh # 或 . test1.sh
echo My name is: $name  # 可以使用test1.sh中的变量

执行命令:

acs@9e0ebfcd82d7:~$ chmod +x test2.sh 
acs@9e0ebfcd82d7:~$ ./test2.sh 
My name is: yxc

Linux基础课

相关文章
|
2月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
411 9
|
2月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
2月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
298 2
|
4月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
533 1
|
6月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
195 4
|
6月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
397 3
|
7月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
618 25
|
7月前
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
164 18
|
9月前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
714 32
|
存储 Shell Linux
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
下一篇
oss云网关配置