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"
}
$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,将会继续执行echoture && 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 bashn=$(( RANDOM % 100 ))if [[ n -eq 42 ]]; thenecho "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.logif [[ $? -ne 0 ]]; thencat out.logecho "次数:$count"breakfi((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 ,将执行的内容作为返回值 |
原文章:http://www.ming-ice-tea.top/?p=28