SHELL学习笔记


shell

学习脚本编程

shell用途

实现自动化

  1. 自动化批量初始化(update,软件安装)
  2. 自动化软件部署(tomcat,nginx)
  3. 管理应用程序(KVM,集群管理扩容,Mysql)
  4. 日志分析处理程序(PV,UV,200,!200,grep/awk,top 100)
  5. 自动化备份,恢复程序(Mysql完全备份/增量 + crond)
  6. 自动化管理程序(批量修改,升级,配置更新)
  7. 自动化信息采集,监控(收集系统/应用状态信息,CPU,内存,disk,apache,Mysql,tcp状态)Zabbix专业软件可实现采集
  8. 自动化扩容(增加云主机–>部署应用)通过监控

shell 打印

echo

echo是用于终端打印的基本命令

echo每次调用都会自动换行

输出的方式三种,无引号,双引号(需要转义),单引号(原样输出)

缺点

使用双引号打印遇到特殊字符就需要转义,或者不要使用双引号,换成单引号可原样输出

如果不使用引号,则没法再文本中显示;,因为分号在bash中为命令界定

单引号的缺点是不能变量替换

printf

printf也是用于终端打印的基本命令:

printf使用引用文本或由空格分隔的参数。

%ns 输出一个字符串,n是数字代指输出几个字符

%ni: 输出整数

%d 整型输出,

%c 输出一个字符,

%f 输出实数,以小数形式输出。

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876

%-10s 指一个宽度为 10 个字符(**-** 表示左对齐,没有则表示右对齐)

%-4.2f 指格式化为小数,其中 .2 指保留2位小数。

输出格式:

格式 功能
\a 输出警告声音
\b 输入退格键
\f 清楚屏幕
\n 换行
\r 回车
\t 水平输出退格
\v 垂直输出退格

文件描述符与重定向

文件描述符

文件描述符是与输入和输出流相关联的整数。常用的文件描述符是stdin、stdout和stderr

  • 0 —— stdin(标准输入)
  • 1 —— stdout(标准输出)
  • 2 —— stderr(标准错误)

重定向

Linux Shell 重定向分为两种,一种输入重定向,一种是输出重定向;

  • 输入方向就是数据从哪里流向程序。数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流入,这就是输入重定向。

  • 输出方向就是数据从程序流向哪里。数据默认从程序流向显示器,如果改变了它的方向,数据就流向其它地方,这就是输出重定向。

表2:Bash 支持的输出重定向符号
类 型 符 号 作 用
标准输出重定向 cmd >file 以覆盖的方式,把 cmd 的正确输出结果输出到 file 文件中。
cmd >>file 以追加的方式,把 cmd 的正确输出结果输出到 file 文件中。
标准错误输出重定向 cmd 2>file 以覆盖的方式,把 cmd 的错误信息输出到 file 文件中。
cmd 2>>file 以追加的方式,把 cmd 的错误信息输出到 file 文件中。
正确输出和错误信息同时保存 cmd >file 2>&1 以覆盖的方式,把正确输出和错误信息同时保存到同一个文件(file)中。
cmd >>file 2>&1 以追加的方式,把正确输出和错误信息同时保存到同一个文件(file)中。
cmd >file1 2>file2 以覆盖的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中。
cmd >>file1  2>>file2 以追加的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中。
cmd >file 2>file 不推荐】这两种写法会导致 file 被打开两次,引起资源竞争,所以 stdout 和 stderr 会互相覆盖
cmd >>file 2>>file

例如:

#标准输出
echo ‘helllo world’ > hello.txt
echo ‘helllo world’ >> hello.txt
   #结果
#‘helllo world’
#‘helllo world’
#标准错误输出重定向
cd sh 2> error.log
cd shell 2>> error.log
   #结果
#-bash: cd: sh: No such file or directory
#-bash: cd: shell: No such file or directory
#正确输出和错误信息同时保存
#同一文件
cat 1.txt > out.log 2>&1
    #结果
#cat: 1.txt: No such file or directory
#hello

#不同文件
cat 1.txt > out.log 2>error.log

如果既想把stdout打印出终端,又想重定向至文件,就需要用到tee命令

tee命令

tee命令用于读取标准输入的数据,并将其内容输出成文件

cat a* |tee  error.log 

image-20220214021923090

注意:tee只能读取stdin ,不能读取到stderr

默认情况tee为覆盖文件,等同于> ,加入-a 参数为追加内容,类似于>>

shell变量

定义变量

定义变量时,变量名和等号之间不能有空格

filename="jayce.txt"

定义命令

variable=`command`
variable=$(command)

定义规则

  1. 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
  2. 中间不能有空格,可以使用下划线 _
  3. 不能使用标点符号
  4. 不能使用bash里的关键字

使用变量

在变量名前加$

name="Jayce"
echo $name
echo ${name}

注意:花括号可选,但最好加

只读变量

name="Jayce"
readonly name

添加了只读后,变量就不可以在变更值

删除变量

unset unset可以删除变量

unset name

注意:unset不能删除只读变量

变量类型

与其他编程语言类似,shell有三种变量类型

  1. 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3. shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

shell字符串

在定义字符串的时候,有三种方法

  • 单引号
    • 单引号中任何字符都可以原样输出,不可嵌套变量
    • 单引号中不可单独出现单独的单引号,转义也不行,但成对可以
  • 双引号
    • 双引号可以有变量
    • 双引号可出现转义字符
  • 不用引号

拼接字符串

  • 双引号
your_name="Jayce"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
#输出 hello, Jayce ! hello, Jayce !
  • 单引号
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3
#输出 hello, Jayce ! hello, ${your_name} !

其中greeting_2中的变量其实并没有在单引号内

greeting_3中的变量未生效,被当做了字符串

获取字符串长度

`$


文章作者: Jayce he
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jayce he !
评论
  目录