首页 > 系统相关 >Linux_3.2 Shell语法

Linux_3.2 Shell语法

时间:2023-12-14 16:47:12浏览次数:27  
标签:do Shell output name 示例 echo 3.2 Linux done

1 循环语句

1.1 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` #$(ls)
do
    echo $file
done
  • 示例3,输出1-10
for i in $(seq 1 10)
do
    echo $i
done
  • 示例4,使用{1..10} 或者

不能在终端里运行,bash内嵌语法

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

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

命令格式:

for ((expression; condition; expression))
do
    语句1
    语句2
done
  • 示例,输出1-10,每个数占一行:
for ((i=1; i<=10; i++))
do
    echo $i
done

1.3 while…do…done循环

命令格式:

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

示例,文件结束符为Ctrl+d,(Ctrl+c也可以直接杀死进程)输入文件结束符后read指令返回false

#每次读入一个变量后就输出这个变量
while read name
do
    echo $name
done

1.4 until…do…done循环

当条件为真时结束或者Ctrl+c

命令格式:

#condion 为真时结束
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

1.5 break命令

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

示例

while read name
do
    for ((i=1;i<=10;i++))
    do
        case $i in
            8)
                break #会跳出for循环
                ;;#类似于c++中的break 跳出当前swich
            *)
                echo $i
                ;;
        esac
    done
done

该示例每读入非EOF的字符串,会输出一遍1-7。
该程序可以输入Ctrl+d文件结束符来结束,也可以直接用Ctrl+c杀掉该进程。

1.6 continue命令

跳出当前这次循环,与C++中完全一致。

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

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

1.7 死循环的处理方式

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

否则可以直接关闭进程:

使用top命令找到进程的PID
输入kill -9 PID即可关掉此进程

2 函数

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#获取函数return值
函数的输入参数
在函数内,$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 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
1

4 文件重定向

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

stdin标准输入,从命令行读取数据,文件描述符为0 cin
stdout标准输出,向命令行输出数据,文件描述符为1 cout 直接打印在终端
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

引入外部脚本

类似于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

标签:do,Shell,output,name,示例,echo,3.2,Linux,done
From: https://www.cnblogs.com/jia-ming/p/17901059.html

相关文章

  • 必须备份的 9 个 Linux 目录和不应该备份的目录
    备份是一项标准的系统管理服务。换句话说,组织中的每个人,从首席执行官到临时工,都依赖我们提供备份。人们会犯错误,您将需要用户数据、公司数据和日志的备份。但在Linux系统上,您需要在备份集中包含哪些内容并不明显。本文将指导您了解备份中应该包含哪些内容和不应该包含哪些内容。......
  • linux下一键上传markdown文件到博客园
    工具链接dongfanger/pycnblog:博客园上传markdown文件(github.com)这是工具的作者,网址里也有些教程,我这里再把教程写一写,加上自己一些使用的方式。诚挚感谢工具作者的开发贡献!使用指南配置typora用Typora进行编写,需要修改图片的存储方式打开文件>偏好设置,找到'图片插入'......
  • Linux操作系统常用操作指令
    Linux操作系统常用操作指令有很多,以下是一些常见的指令:ls:列出目录内容。cd:改变当前工作目录。pwd:显示当前工作目录的路径。mkdir:创建新目录。rmdir:删除空目录。rm:删除文件或目录。cp:复制文件或目录。mv:移动或重命名文件或目录。cat:显示文件内容。more和less:分页显示文......
  • 利用Docker和CLion在Mac优雅地开发和调试Linux C++程序
    利用Docker和CLion在Mac优雅地开发和调试LinuxC++程序starrymarin计算机主业,间断性健身爱好者,摩托、金融入门​关注他 27人赞同了该文章最近在做一些新的东西,所以学习了一些新的东西,也对旧知识加强了很多,所以终于有东西可以记录一下了。今天先更......
  • linux下,需要删除windows中^M
    linux下,如果需要在vim中查看^M,需要使用如下命令:在Vim的命令模式中输入:e++ff=unix%有时候,我们在Linux中打开曾在Win中编辑过的文件时,会在行尾看到^M字符。虽然,这并不影响什么,但心里面还是有点不痛快。如果想要删除这些^M字符,可以使用Vim来轻松搞定它。在Vi......
  • Linux 部署企业级夜莺监控分析工具并实现远程访问(运维零距离!!)
    夜莺监控是一款开源云原生观测分析工具,采用All-in-One的设计理念,集数据采集、可视化、监控告警、数据分析于一体,与云原生生态紧密集成,提供开箱即用的企业级监控分析和告警能力。夜莺于2020年3月20日,在github上发布v1版本,已累计迭代100多个版本。本地部署后,为解决......
  • Linux 部署1Panel现代化运维管理面板教程并且实现远程访问(运维福音!!)
    1Panel是一个现代化、开源的Linux服务器运维管理面板。高效管理,通过Web端轻松管理Linux服务器,包括主机监控、文件管理、数据库管理、容器管理等下面我们介绍在Linux本地安装1Panel并结合cpolar内网穿透工具实现远程访问1Panel管理界面1.Linux安装1Panel执行如下......
  • go语言window|mac|linux下交叉编译其他平台的软件包
    go语言window|mac|linux下交叉编译其他平台的软件包注意:go1.17发现直接使用set是不起作用的,必须要使用goenv-w来设置一、设置编译环境,需要发布哪个平台Window下1、设置Linux编译环境SETCGO_ENABLED=0setGOARCH=amd64setGOOS=linux2、设置Mac编译环境goenv-wCGO_ENA......
  • OpenHarmony应用编译 - 如何在源码中编译复杂应用(3.2-Release)
    概述文档环境开发环境:Windows11编译环境:Ubuntu22.04开发板型号:DAYU200(RK3568)系统版本:OpenHarmony-3.2-Release涉及仓库:applications_launcher功能简介在OpenHarmony系统中预安装应用的hap包会随系统编译打包到镜像中,目前有两种编译预安装应用hap包的方式,一种为随系统......
  • springboot虚拟线程(jdk21,springboot3.2.0)
    1.什么是虚拟线程虚拟线程是JDK21版本正式发布的一个新特性。虚拟线程和平台线程主要区别在于,虚拟线程在运行周期内不依赖操作系统线程:它们与硬件脱钩,因此被称为“虚拟”。这种解耦是由JVM提供的抽象层赋予的。虚拟线程的运行成本远低于平台线程。它们消耗的内存要少得多。这就......