shell教程(三)基本语句
引用:
https://www.acwing.com/file_system/file/content/whole/index/content/2855883/
判断语句
if…then形式
类似于C/C++中的if-else语句。
单层if
命令格式:
1 | if condition |
示例:
1 | a=3 |
单层if-else
命令格式
1 | if condition |
示例:
1 | a=3 |
输出结果:
1 | 3小于4 |
多层if-elif-elif-else
命令格式
1 | if condition |
示例:
1 | a=4 |
输出结果
1 | 其他 |
case…esac形式
类似于c/c++中的switch语句
命令格式
1 | case $变量名称 in |
示例:
1 | a=4 |
输出结果:
1 | 其他 |
循环语句
for…in…do…done
命令格式:
1 | for var in val1 val2 val3 |
示例1,输出a 2 cc,每一个元素一行:
1 | for i in a cc |
示例2,输出当前路径下的所有文件名,每个文件名一行:
1 | for file in `ls` |
示例3,输出1-10
1 | for i in $(seq 1 10) |
示例4,使用{1..10}或者{a..z}
1 | for i in {a..z} |
for ((…;…;…)) do…done
命令格式:
1 | for ((expression;condition;expression)) |
示例,输出1-10,每个数占一行:
1 | for ((i=1;i<=10;i++)) |
while…do..done循环
命令格式:
1 | while condition |
示例,文件结束符为ctrl+d,输入文件结束符后read指令返回false。
1 | while read name |
until…do…done循环
当条件为真时结束。
命令格式:
1 | until condition |
示例,当用户输入yes或者YES时结束,否则一直等待读入。
1 | until [ "${word}" == "yes" ] || [ "${word}" == "YES" ] |
break命令
跳出当前一层循环,注意与c/c++不同的是:break不能跳出case语句。
示例:
1 | while read name |
该示例每读入非EOF的字符串,会输出一遍1-7。
该程序输入ctrl+d文件结束符来结束,也可以直接用ctrl+c杀掉改进程。
continue命令
跳出当前循环。
示例:
1 | for((i=1;i<=10;i++)) |
该程序输出1-10中的所有奇数。
死循环的处理方式
ctrl+c
函数
bash中的函数类似于C/C++中的函数,但return的返回值与C/C++不同,返回的是exit code,取值为0-255,0表示正常结束。
如果想获取函数的输出结果,可以通过echo输出到stdout中,然后通过$(function_name)来获取stdout中的结果。
函数的return值可以通过$?来获取。
命令格式:
1 | [function] func_name() { # function关键字可以省略 |
不获取 return值和stdout值
示例
1 | func() { |
输出结果:
1 | Hello insistgang |
获取return值和stdout值
不写return时,默认return 0。
示例
1 | func() { |
输出结果:
1 | output = Hello insistgang |
函数的输入参数
在函数内,$1表示第一个输入参数,$2表示第二个输入参数,依此类推。
注意:函数内的$0仍然是文件名,而不是函数名。
示例:
1 | echo $(func 10)func() { # 递归计算 $1 + ($1 - 1) + ($1 - 2) + ... + 0 |
输出结果:
1 | 55 |
函数内的局部变量
可以在函数内定义局部变量,作用范围仅在当前函数内。
可以在递归函数中定义局部变量。
命令格式:
1 | local 变量名=变量值 |
例如:
1 | ! /bin/bash |
输出结果:
1 | insistgang |
第一行为函数内的name变量,第二行为函数外调用name变量,会发现此时该变量不存在。
exit命令
exit命令用来退出当前shell进程,并返回一个退出状态;使用$?可以接收这个退出状态。
exit命令可以接受一个整数值作为参数,代表退出状态。如果不指定,默认状态值是 0。
exit退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。
示例:
创建脚本test.sh,内容如下:
1 | ! /bin/bash |
执行该脚本:
1 | chmod +x test.sh |
每个进程默认打开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中 |
输入和输出重定向
创建bash.sh脚本:
1 | ! /bin/bash |
创建input.txt,里面的内容为:
1 | 3 |
执行命令:
1 | chmod +x test.sh # 添加可执行权限 |
引入外部脚本
类似于C/C++中的include操作,bash也可以引入其他文件中的代码。
语法格式:
1 | . filename # 注意点和文件名之间有一个空格 |
示例
创建test1.sh,内容为:
1 | ! /bin/bash |
然后创建test2.sh,内容为:
1 | ! /bin/bash |
执行命令:
1 | chmod +x test2.sh |







