资讯动态

shell语法(循环、函数、重定向、exit、引入外部脚本)

发布时间:2026/10/13 9:57:37 来源:尧图企业网站定制
一、循环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 do echo $file done这个是~上面那个在前文默认变量里讲过command表示返回的是command这个命令的stdout所以就解析出他的标准输出也就是当前路径下的所有文件名。示例3输出1-10for i in $(seq 1 10) do echo $i done示例4使用{1..10} 或者 {a..z}for i in {a..z} do echo $i done这个输出是a到z并且每个都有一个空格。2. for ((…;…;…)) do…done命令格式for ((expression; condition; expression)) do 语句1 语句2 done示例输出1-10每个数占一行for ((i1; i10; i)) do echo $i done3. while…do…done循环命令格式while condition do 语句1 语句2 ... done示例文件结束符为Ctrld输入文件结束符后read指令返回false。while read name do echo $name done这个例子当read name正常读取的时候read返回的值是0在shell里面0表示真非0表示假所以这个循环会继续执行当摁下ctrld的时候read返回的是1所以为假循环结束。4. until…do…done循环当条件为真时结束与前面那个while是反着的。命令格式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 done5. break命令跳出当前一层循环注意与C/C不同的是break不能跳出case语句在shell里面;;是跳出case。示例while read name do for ((i1;i10;i)) do case $i in 8) break ;; *) echo $i ;; esac done done该示例每读入非EOF的字符串会输出一遍1-7。该程序可以输入Ctrld文件结束符来结束也可以直接用Ctrlc杀掉该进程这里说明一下最外层循环时while再一层时for最里面时case也就是有两层循环当i8时遇到break这个break是跳出了这一层for循环的所以后面的 ;; 命令不会被执行;; 命令相当于告诉编译器我这个case分支在这结束了。6. continue命令跳出这次循环比如离他最近的是for循环他会跳出这次i1进入i2。示例for ((i1;i10;i)) do if [ expr $i % 2 -eq 0 ] then continue fi echo $i done该程序输出1-10中的所有奇数遇到偶数就直接continue所以就不输出偶数。死循环的处理方式:如果AC Terminal可以打开该程序则输入Ctrlc即可。否则可以直接关闭进程使用top命令找到进程的PID输入kill -9 PID即可关掉此进程二、函数bash中的函数类似于C/C中的函数但return的返回值与C/C不同返回的是exit code取值为0~2550表示正常结束在shell语言里输出主要分为两种一种是stdout这种是标准的输出也就是正常你想输出什么就输出什么还有一种是exit code这种是返回函数的退出状态的比如我函数成功执行我输出0没有成功执行输出1。如果想获取函数的输出结果可以通过echo输出到stdout中然后通过$(function_name)来获取stdout中的结果。函数的return值可以通过$?来获取。1. 不获取return和stdout值func() { nameyxc echo Hello $name } func在vim中保存好后直接在终端里./test.sh调用就行。2. 获取return和stdout值func() { nameyxc echo Hello $name return 123 } output$(func) ret$? ##容易犯错的地方就是ret $?这个样子就是错的 echo output $output echo return $ret这里有个注意的点就是赋值的时候不能有空格。3. 函数的输入参数在函数内$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 ] #-le是小于等于号less than or equal then echo 0 return 0 fi sum$(func $(expr $1 - 1)) echo $(expr $sum $1) } echo $(func 10)简单分析一下定义了一个wordwhile用来进入是否需要进入func函数第一个if是n那就返回0并且return 0跳出函数第二个if是如果小于等于同样返回然后进入主要的环节开始递归参数一直递减直到0为止expr用于求表达式的值在回溯的时候是靠echo $(expr $sum $1)这一段代码进行回溯。4. 函数内的局部变量可以在函数内定义局部变量作用范围仅在当前函数内。可以在递归函数中定义局部变量。#! /bin/bash func() { local nameyxc echo $name } func echo $name输出结果是yxc第一行为函数内的name变量第二行为函数外调用name变量会发现此时该变量不存在也就是说这个local会把name定义成局部变量。5. exit命令exit命令用来退出当前shell进程并返回一个退出状态使用$?可以接收这个退出状态。exit命令可以接受一个整数值作为参数代表退出状态。如果不指定默认状态值是 0。exit退出状态只能是一个介于 0~255 之间的整数其中只有 0 表示成功其它值都表示失败。#! /bin/bash if [ $# -ne 1 ] # 如果传入参数个数等于1则正常退出否则非正常退出。 then echo arguments not valid exit 1 else echo arguments valid exit 0 fi这个是如果传入的参数个数等于1那就exit 0否则exit 1。三、文件重定向每个进程默认打开3个文件描述符stdin标准输入从命令行读取数据文件描述符为0stdout标准输出向命令行输出数据文件描述符为1stderr标准错误输出向命令行输出数据文件描述符为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里面的内容为33 44执行命令acs9e0ebfcd82d7:~$ chmod x test.sh # 添加可执行权限 acs9e0ebfcd82d7:~$ ./test.sh input.txt output.txt # 从input.txt中读取内容将输出写入output.txt中 acs9e0ebfcd82d7:~$ cat output.txt # 查看output.txt中的内容 77 ##第二种 ./test.sh output.txt input.txt cat output.txt 77解释一下这些命令首先创建了一个 test.sh 脚本用于计算 a 与 b 的和接着创建 input.txt其中的两行内容恰好对应 a 和 b 的取值。执行./test.sh input.txt output.txt时由于 input.txt将 test.sh 的 stdin 重定向到了 input.txt脚本运行时不会从终端读取输入而是直接从 input.txt 中读取随后 output.txt将 stdout 重定向到 output.txt 文件中而不是输出到终端。第二种shell 先看到output.txt于是把 test.sh的stdout接到 output.txt。shell 再看到 input.txt于是把test.sh 的stdin接到 input.txt,然后才启动test.sh。四、引入外部脚本类似于C/C中的include操作bash也可以引入其他文件中的代码。语法格式. filename # 注意点和文件名之间有一个空格 或 source filename示例创建test1.sh内容为#! /bin/bash nameyxc # 定义变量name然后创建test2.sh内容为#! /bin/bash source test1.sh # 或 . test1.sh echo My name is: $name # 可以使用test1.sh中的变量这个source test1.sh其实就是把test1.sh里面的内容都执行一遍。所以test2.sh中不加#! /bin/bash也是可以的。执行命令acs9e0ebfcd82d7:~$ chmod x test2.sh acs9e0ebfcd82d7:~$ ./test2.sh My name is: yxc

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑