Shell Script
Shell Script
赋值操作
foo=bar
echo $foo

注意: 不要使用空格分开

shell 将会把foo当作一个程序
转义
Bash通过使用''和""来定义字符串
""会将字符串中的变量转义
echo "String is $foo"

''会将字符串中的变量原样输出
echo 'String is $foo'

函数
函数内容:创建一个目录并进入目录的脚本mcd.sh
mcd(){
mkdir -p "$1"
cd "$1"
}
Bash中读取并执行文件中的命令
source mcd.sh
调用mcd函数,创建一个test目录
mcd test

返回码
0:程序成功执行- 非
0:程序有错误
使用$?来查看上条命令返回码
ls #成功执行
cd ooo #假设当前目录下没有ooo这个目录,则有错误发生

true程序返回值始终都是0
false程序返回值始终都是1

逻辑运算符
&&:与运算||:或运算
示例:
ture || echo "OR" # ture的返回值是0,所以不会再执行echo
false || echo "OR" # false的返回值是1,将会继续执行echo
ture && echo "AND" # ture的返回值是0,echo的返回值也是1,所以都会执行
false && echo "AND" # false的返回值是1,echo的返回值是1,将不会执行echo

命令替换
$(CMD)当执行时,shell首先会执行CMD然后使用CMD的结果去替换$(CMD)
示例:
#!/bin/sh
for i in $(ls);
do
echo $i
done
这条语句就是ls得到目录里的内容,然后遍历该内容

进程替换
<(CMD)与$(CMD)类似,<(CMD)会将CMD执行的的结果输出到一个临时文件中
示例:
diff <(ls d_1) <(ls d_2)
查看两个不同目录的内容,并将其存到临时文件中,使用diff判断目录内容的区别

通配符
| 符号 | 含义 |
|---|---|
* |
匹配多个字符 |
? |
匹配单个字符 |
花括号
在花括号中放入一些字符串,花括号将会展开执行命令
示例:
touch {1,2,3,4,5}
相当于执行了
touch 1
touch 2
touch 3
touch 4
touch 5
如果有多个{},将会按照笛卡尔积去执行
示例:
touch {1,2,3,4,5}-{a,b,c}
相当于执行了
touch 1-a
touch 1-b
touch 1-c
....
touch 5-c
shellcheck
Shellcheck可以用来检查shell脚本错误

课后作业
- 题目:
ls格式化输出:- 彩色
- 指定存储单位
- 按最后修改时间排序
- 所有文件
ls --block-size=M --color=always -lt -a

- 题目:
编写两个shell脚本- 每当你执行
marco时,当前的工作目录应当以某种形式保存 - 当执行
polo时,无论现在处在什么目录下,都应当cd回到当时执行marco的目录
- 每当你执行
#!/bin/bash
marco(){
$(pwd) > ~/marco.log
}
polo(){
cd $(cat ~/marco.log)
}
- 题目:
编写一段 bash 脚本,运行如下的脚本直到它出错,将它的标准输出和标准错误流记录到文件,并在最后输出所有内容。
#测试脚本
#!/usr/bin/env bash
n=$(( RANDOM % 100 ))
if [[ n -eq 42 ]]; then
echo "Something went wrong"
>&2 echo "The error was using magic numbers"
exit 1
fi
echo "Everything went according to plan"
#!/bin/bash
count=0
echo > out.log
while true
do
./testscript.sh &> out.log
if [[ $? -ne 0 ]]; then
cat out.log
echo "次数:$count"
break
fi
((count++))
done
- 题目:
您的任务是编写一个命令,它可以递归地查找文件夹中所有的 HTML 文件,并将它们压缩成 zip 文件
find / -name "*.html" | xargs zip html.zip
xargs
5. 题目:
编写一个命令或脚本递归的查找文件夹中最近使用的文件
按照最近的使用时间列出文件
find . -type f -mmin -60 -print0 | xargs -0 ls -lt |head -10
特殊字符参考表
| 特殊字符 | 含义 |
|---|---|
$0 |
脚本名 |
$1~$9 |
脚本的第一到第九个参数 |
$@ |
所有参数 |
$# |
参数个数 |
$? |
前一个命令的返回值 |
$$ |
脚本的进程码 |
!! |
完整的上一条命令 |
$_ |
上一条命令的最后一个参数 |
$(CMD) |
会首先执行CMD,将执行的内容作为返回值 |

浙公网安备 33010602011771号