声明:
这一部分为 Linux 基础课内部内容,根据 y总要求,将原课程的链接给出
循环
前置知识:for while if 中的判断真假是依据 condition 的 exitcode 也就是 0为真,非0表示假
格式1
for.. in .. do.. done
具体格式如下:
for var in var1 var2 var3
do
语句1
语句2
done
eg:
这里循环输出了 var1 var2 var3
eg2:
ls
是取 ls 这个命令的 stdout,而 ls 会输出当前目录下的所有文件
eg3:
seq
这个命令用于表示从一个数字到另一个数字之间的所有整数,并且只能表示数字
seq 1 10
表示 1 2 3 4 5 6 7 8 9 10 也可以用 {1..10}
{a..z}
表示 a-z 的 26个字母
这里都是循环输出相关的内容
格式2
和c 很像的 for
for ((expression; condition; expression))
do
语句1
语句2
done
eg: 输出 1-10 的数字,
格式3 while do done 循环
while condition
do
语句1
语句2
...
done
eg: 文件结束符为Ctrl+d
,输入文件结束符后read
指令返回false
,此时循环退出
格式4 until…do…done 循环
当 until 后面的 condition 为真时,结束循环
break 命令
这个命令只能跳出一层循环,而且 break 不会跳出 case 语句
下面这个循环,每接收一个输入,如果这个输入不是文件终止符,
则输出一遍 1-7(到 8 的时候被 break 终止掉了循环)
要想结束外层的 while 循环,可以输入 ctrl+d(文件结束符)
,也可以直接使用 ctrl+c
杀掉该进程
continue 命令
跳出本次循环,和 c++ 里面的一样
eg: 下面的例子会输出 1-10 中所有的奇数,i 为偶数时, 结果为 0 eq 成立, 进入 if
continue 则不会输出当前的值 i
死循环的处理方式
- 如果AC Terminal可以打开该程序,则输入Ctrl+c即可
- 先使用top命令找到进程的PID,再输入kill -9 PID即可关掉此进程
函数
bash中的函数返回的是 exit code
取值在 0-255 之间,0 表示正常结束,获取函数的返回值可以用 $?
如果想要获取函数的输出结果,可以先通过 echo
输出到标准输出stdout
中,然后通过 $()
或者 两个点(``)
来获取
命令格式
[function] func_name() { # function关键字可以省略
语句1
语句2
...
}
eg1:
不写 return 默认返回的就是 0
eg2:
获取函数的 exitcode
和 stdout
函数的局部变量
可以在函数内定义局部变量,作用范围仅在当前函数内.
可以在递归函数中定义局部变量.
格式为: local 变量名=变量值
eg:
1. 第一行为函数内的 name 变量
2. 第二行为函数外调用 name 变量,会发现此时该变量不存在,显示为空.
函数的参数
Q: 如何传入参数?
在调用的地方后面跟着写即可
Q: 如何获取传入的参数?
在函数内,$1
表示第一个输入参数,$2
表示第二个输入参数,依此类推.
注意:函数内的$0
仍然是文件名,而不是函数名.
exit 命令
这个命令可以退出当前进程,并返回 exitcode
(用$?
获取)
exit 命令可以接受一个整数值作为参数,代表退出状态.如果不指定,默认状态值是 0.
exit 退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败.
eg:
文件重定向
概念:每个进程默认打开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中
eg1:
command 1>file
其实就是重定向文件的标准输出
eg2:
eg3:
引入外部脚本
类似于c语言中的 include
引入其他文件中的代码
. filename # 注意点和文件名之间有一个空格
或
source filename
相当于把被引入的文件中的代码全部给搬了过来
eg:
参考
$( )
捕获括号内表达式的输出后,就不会在终端再次输出了