todo list
符号的作用:
“” ‘’ `
${} () [] & IFS $[] $? $!
| >> < > <<
\0 \r \t $ ….
空格的影响
如何定义变量? 如何定义函数 ? 如何调用变量? 如何调用函数?
获取用户输入 read
数据处理之 cat. grep. tr. find. xargs.
tr 替换 删除
split 分割文件
关于函数中 echo 和return 在流中的体现
关于交互式命令、脚本的自动化 echo -e “ \n \n \n “
SHELL脚本学习笔记
写在最前面:
- 编写目的: 记录学习shell脚本中, 一些容易混淆、遗忘的知识点。
- 参考书籍: Linux Shell 脚本攻略 (其实市面上任一本SHELL编程书籍都可, 关键在于实际运用)
- 为什么要学习SHELL: 同学习Python目的差不多, 简单易上手, 方便快速开发, 在脚本编写初期使用SHELL+Python+现有工具 实现集成、自动化十分方便快捷。
重点在于:命令执行 、结果处理 、结果保存 - 笔记结构: 第一部分记录一些语法,第二部分记录容易遗忘、混淆的知识点。
SHELL脚本基础
记录一些基础的东西(语法、常用命令等)
1. 输出命令
就输出命令来说, 我们更加关心自定义的变量如何输出、如何操控输出的格式, 在Shell脚本中,
echo和printf都可用于输出, 常用的为echo, 两者区别并不大。我们更加关注与其输出时使用的 **” “ , ‘ ‘ ,和` ` ** 的区别
单引号
以单引号' '包围变量的值时,会将其内容原样输出。双引号
以双引号" "包围变量的值时,输出时会先解析里面的变量、命令和格式符号**(echo 需要加上-e 参数才能解析格式符号)** ,然后在输出。var1="HELLOWORLD" echo "$var1"反引号
反引号 ` ` 会先解析内容, 然后将其当做命令执行echo `dir` # 其等价于下列命令, 反引号会先解析变量为dir 然后 将内容dir作为命令执行 var1="dir" echo `$var1` # 在双引号中也可使用`` echo "`date`"格式化输出变量
# echo 和print 都可以用转义符号 \t \n \r 等 ,echo 需要使用 -e来将转义符号进行解析 echo -e " \t Hello \t world " # 而printf 命令可以使用格式替换福 %s %c %d等, 类似于C语言 printf "%s %s %s \r" Hello world !关于两个命令更具体的使用可以用man echo ,man printf进行查看
2.变量
关于环境变量、以及变量处理
环境变量
环境变量可以在终端中输入env查看, 在bash中可以直接使用$ 符号调用已有的环境变量#当前使用的何种shell $SHELL #也可使用$0查看 $0 #运行sh脚本时输入的参数 $1 $2 $3 #查看用户ID ,root为0 $UID全局变量
有时候在shell脚本中 会调用另一个shell脚本, 这时候通过export将要传递的变量设置为环境变量即可var1="Helloworld" #注意: export 后面的变量不需要$符号 export var1 #此时调用的其他脚本都可以访问var1 这个变量 bash 2.sh其他
数学运算(整数运算)# 数字赋值 no1 =1 no2 =3 # 使用let可直接进行数学运算, 注意使用let时变量不需要$符号 let no3 =no1+no2 echo $no3 # 自增自减 let no1++ let no2-- # [ ] (()) expr和let使用方法相同 no4=$[ no1+no2 ] no5=$((no1+no2)) no6=`expr $no1 + $no2` #注意expr后面两个变量和运算符号之间有空格获取字符串长度
#使用 ${#str}获取 var1=1234567890 echo ${#var1}
3. 文件描述符、重定向、管道符号
在编写脚本的时候会频繁用到标准输入( stdin)、标准输出( stdout)和标准错误
( stderr)。文件描述符是与某个打开的文件或数据流相关联的整数。 文件描述符0、 1以及2是系统预留的。
- 0 —— stdin (标准输入)。
- 1 —— stdout(标准输出)。
- 2 —— stderr(标准错误)。
重定向符号有两种
- 输出重定向: ,>> 和> ,两者的区别是 > 会将指向 的文件清空后写入, >> 是在尾部拼接
- 输入重定向 <
| 管道符号, 将前一条命令的结果作为输入传递给后面的命令、
- 标准流和重定向使用
#执行一条不存在的命令, 将错误信息输出到一个文件中
testforerror 2 > error.log
# &> 或 2>&1 表示将stdout 和stderr输出到某个文件中
cat *.txt &> errout.log
# 输入重定向使用举例: 将shell脚本中的命令传入bash中
bash < 5.sh
创建一个新的文件描述符
文件描述符可以看做一个指针变量,通过该变量我们可以对文件进行存取操作。注意0、1 、2是预留的描述符号,我们可以通过
exec命令结合重定向符号创建文件描述符# 创建一个读取文件的文件描述符并使用cat读取 exec 3< text.txt # 即可进行读取 cat <&3 # 创建用于写入 的文件描述符, >> 为追加模式 , > 为覆盖模式 exec 5>>input.txt
4. ${} 对变量处理的使用
5. shell 的debug模式
6. 函数
函数的定义、传递的参数、返回值
定义
function fname() { statements; } 或者 fname() { statements; } #执行函数 fname arg1 arg2参数访问
$0是脚本名称。 $1是第一个参数。 $2是第二个参数。 $n是第n个参数。 $?接收上一条函数的执行结果 "$@"被扩展成"$1" "$2" "$3"等。 "$*"被扩展成"$1c$2c$3",是一个字符串,不常用返回值
return 只能返回一个整型变量, 要返回字符串可以通过设置全局变量, 或者利用输出信息获取。#全局变量 fun1() { s="$" export s } fun1 test echo $s # 输出信息 get_str() { echo "string" } echo `get_str` #写法一 echo $(get_str) #写法二
SHELL脚本应用
单引号和双引号的区别?如何改变终端输出的颜色? 如何结合Linux的命令对结果进行处理?
1. 单引号和双引号的区别
2. 控制终端输出颜色
有时候为了美化,可以对输出加上颜色控制
字体颜色范围为 3039 , 背景颜色范围为4049更多设置可以使用
man console_codes查看
字体颜色控制
常用颜色码为: 重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37。背景颜色控制
常用颜色码为: 重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47。使用方式
\e[1;字体颜色 或 背景颜色m即可进行设置,若想同时设置 使用; 分开即可如\e[1;33;44m重置 :使用
\e[0mecho -e "\e[1;33;45m Hello \e[1;37;42m world \e[0m" printf "\e[1;33;41m Hello \e[1;37;42m world \e[0m"
3. 字符匹配与替换
常用命令 tr 、sed 、awk 、grep …
4. 字符串转数字
结果保存
参考
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1944270374@qq.com
