shell脚本从入门到精通(中级)之提高篇
shell 脚本入门到精通(中级)
一、shell 脚本的执行
二、输出格式化
三、数据类型
四、重定向
五、变量
一、shell 脚本的执行
1. 脚本执行的4种方法
$ ls /tmp/test.sh
/tmp/test.sh
#!/bin/bash
# test.sh
# 这里借助SHLVL这个变量,SHLVL可以显示shell的层级,
# 每启动一个shell,这个值就加1
echo "shell level :$SHLVL"
echo "hello world!"
切换到shell脚本所在目录执行
root@localhost:/# cd /tmp/
root@localhost:/tmp# chmod +x test.sh
root@localhost:/tmp# ./test.sh
shell level :2
hello world!以绝对路径执行
root@localhost:~# chmod +x /tmp/test.sh
root@localhost:~# /tmp/test.sh
shell level :2
hello world!直接使用bash或sh 来执行bash shell脚本
root@localhost:/tmp# bash test.sh
shell level :2
hello world!
root@localhost:/tmp# sh test.sh
shell level :1
hello world!在当前shell 环境中执行
root@localhost:/tmp# . test.sh
shell level :1
hello world!
root@localhost:/tmp# source test.sh
shell level :1
hello world!
总结:注意看SHLVL的值,前3种方式都在子shell中执行(sh除外),第4种在当前shell种执行。
2.调试脚本
bash -x script.sh 跟踪调试shell脚本
例:
root@localhost:/tmp# bash -x test.sh
+ echo 'shell level :2'
shell level :2
+ echo 'hello world!'
hello world!
-x 打印所执行的每一行命令以及当前状态
set -x : 在执行时显示参数和命令
set +x : 禁止调试
set -v : 当命令进行读取时显示输入
set +v : 禁止打印输入
二、输出格式化
1. C语言风格的格式化
#!/bin/bash
printf "%-5s %-10s %-4s\n" NO. Name Mark
printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
printf "%-5s %-10s %-4.2f\n" 2 James 90.9989
root@localhost:/tmp# ./test.sh
NO. Name Mark
1 Sarath 80.35
2 James 91.00
2. echo
- 不换行
echo -n "hello world" - 转义
echo -e "hello\t\tworld" - 彩色输出
| 颜色 | 重置 | 黑 | 红 | 绿 | 黄 | 蓝 | 紫 | 青 | 白 |
|---|---|---|---|---|---|---|---|---|---|
| 前景色 | 0 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
| 背景色 | 0 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
echo -e "\e[1;31m This is red test \e[0m"
或
echo -e "\033[47;31m This is red test \033[0m"
三、数据类型
1.字符串
获取字符串长度
root@localhost:/# str="hello"
root@localhost:/# echo ${#str}
5
2. 数组
- 数组的定义
方法一:
arr=(1 2 3 4 5)
方法二:
arr[0]=1
arr[1]=2
arr[2]=3
echo ${arr[*]}
1 2 3
打印数组中的值
root@localhost:~# arr=(1 2 3 4 5)
root@localhost:~# echo ${arr[2]}
3
root@localhost:~# echo ${arr[*]}
1 2 3 4 5
root@localhost:~# echo ${arr[@]}
1 2 3 4 5关联数组 -- 数组的高级用法
普通数组只能使用整数作为索引值,而关联数组可以使用任意文本作为索引值(有点类似于Python中的字典,不知道这样理解对不对),关联数组只在bash 4.0以上支持。
查看bash版本的方法:
bash -version
关联数组的定义和使用
root@localhost:~# declare -A person
root@localhost:~# person=([name]="Wang" [age]=18)
root@localhost:~# echo ${person[name]}
Wang
root@localhost:~# echo ${person[age]}
18
root@localhost:~# echo ${person[*]}
Wang 18
四、重定向
| 符号 | 含义 | 用法 | 例 |
|---|---|---|---|
| < | 标准输入 | 从文件中输入 | wc -l file.txt |
| > | 标准输出 | 目标文件不存在会新建一个;目标文件存在会覆盖原内容 | echo "" > /var/www/html/index.php |
| >> | 追加到文件 | 目标文件不存在会新建一个;目标文件存在会在文件末尾追加 | echo "add text" >> file.txt |
例:
从定向的用法
# cat >> file.sh << EOF
> #!/bin/bash
> echo "hello"
> EOF
/dev/null 相当于垃圾桶
例:把标准输出重定向到/dev/null
yum makecache > /dev/null
五、变量
1. 只读变量
root@localhost:~# cat file.sh
#!/bin/bash
readonly hours_per_day=24
hours_per_day=12
更改变量会触发异常
root@localhost:~# ./file.sh
./file.sh: line 3: hours_per_day: readonly variable
2. 展开运算符
| 运算符 | 用途 | 例 |
|---|---|---|
| ${varname:-word} | 如果变量存在且非null,则返回其值; 否则返回word |
# echo ${service:-"service is not defined"} service is not defined |
| ${varname:=word} | 如果变量存在且非null,则返回其值; 否则设置它的值为word并返回 |
root@localhost:~# echo ${service:=httpd} |
| ${varname:+word} | 如果变量存在且非null,则返回word; 否则返回null |
echo ${service:+1} |
| ${varname:?message} | 如果变量存在且非null,则返回其值; 否则显示message,并退出当前脚本或命令; message默认信息为:parameter null or not set |
# echo ${b:?} -bash: b: parameter null or not set # echo ${b:?"not defined"} -bash: b: not defined |
shell脚本从入门到精通(中级)之提高篇的更多相关文章
- shell脚本从入门到精通(初级)之入门篇
写在开头 本文是阅读<Linux命令行与shell脚本编程大全>时的一些笔记,主要是shell脚本的一些基本语法, 还有很多细节和高级内容没有写到. 笔者也是shell script菜鸟, ...
- shell脚本从入门到精通
阿里云大学 shell脚本从入门到精通 第1 章 : shell脚本编程-变量-算术表达式-判断语句-if分支语句 第2 章 : case-for-While-双括号-循环嵌套-break-conti ...
- Android Studio2.0 教程从入门到精通Windows版 - 提高篇
第二篇我们开发了一个Hello World应用,并介绍Android Sutdio的界面和如何调试应用,接下来将介绍一些常用的快捷键和必备插件. 常用快捷键 代码跳转 描述:跳转是为了方便代码位置的定 ...
- 08 bash特性--shell脚本编程入门
shell脚本编程入门 编程语言介绍 编程语言分为:机械语言.汇编语言和高级语言: 计算机能识别的语言为机械语言,而人类能学习的并且能够方便掌握的为高级语言,所以,我们所编写的程序就要通过编译来转换成 ...
- Shell脚本快速入门
最近看了下Shell脚本.曾经遇到很多现成的工具包里边就多次用到了Shell脚本.总之这东西的作用无非就是将一系列的操作进行整合. ·整合后使得一套工作更加模块化规范化. ·批量处理要比手动操作快得多 ...
- Shell脚本学习入门(一)
1.Shell脚本是解释型的语言. 2.Shell脚本建立的基本步骤: 3.Shell脚本文件的第一行一般可以是:"#! 路径名 -(选项)", 为了要使Shell脚本有移植性,请 ...
- Linux bash shell脚本语法入门
1.基础 #!/bin/bash //bash脚本第一句都是这个,他会让系统指定以bash来解释这个脚本 # //shell脚本注释符号 2.变量和使用 HOME= ...
- (转)Linux bash shell脚本语法入门
http://www.linuxsky.org/doc/newbie/201004/389.html 1.基础 #!/bin/bash //bash脚本第一句都是这个,他会让系统指定以bash来解释这 ...
- [拾 得] 一枚迷人的贝壳 SHELL / Linux | shell 脚本初步入门
坚持知识分享,该文章由Alopex编著, 转载请注明源地址: http://www.cnblogs.com/alopex/ 索引: 什么是shell shell的分类 shell脚本的执行方式 ...
随机推荐
- cmd优化
cmd很方便,很简约,但是看久了也会视觉疲劳 因此我们来优化一下cmd 原博文是我的一位同学写的,链接如下:https://www.cnblogs.com/ljsh/p/10877715.html 打 ...
- handy源码阅读(三):SafeQueue类
SafeQueue类继承与信号量mutex(用于加锁),nonocopyable 定义如下: template <typename T> struct SafeQueue : privat ...
- [USACO10MAR]伟大的奶牛聚集Great Cow Gat… ($dfs$,树的遍历)
题目链接 Solution 辣鸡题...因为一个函数名看了我贼久. 思路很简单,可以先随便指定一个根,然后考虑换根的变化. 每一次把根从 \(x\) 换成 \(x\) 的一个子节点 \(y\),记录一 ...
- Cocoapods组件化之搭建组件化项目框架
一,概述 随着公司业务需求的不断迭代发展,工程的代码量和业务逻辑也越来越多,原始的开发模式和架构已经无法满足我们的业务发展速度了,这时我们就需要将原始项目进行一次重构大手术了.这时我们应该很清晰这次手 ...
- 关闭本机的代理服务(Proxy)
若您使用了代理服务(Proxy),可能会导致战网游戏发生网络连接.安装或更新方面的问题.请参考以下步骤来关闭您电脑的网络代理服务. Windows 按下 Windows 按鍵 + R . 在运行框中, ...
- [hadoop](3) MapReduce:创建计数器、任务状态和写入日志
前言 本章主要讲述了如何在mapreduce任务中添加自定义的计数器,从所有任务中聚合信息,并且最终输出到mapreduce web ui中得到统计信息. 准备工作 数据集:ufo-60000条记录, ...
- LintCode之加一
题目描述: 分析:由样例可以知道,当数组的每一个数字都是9时,加一会产生一个最高位的数字1,所以先判断这个数组的每一位是否都是9,如果是,那么新数组的大小是原数组大小加一,否则新数组的大小等于原数组的 ...
- JS replace方法
var str = '1abc2defg3hijk'; str.replace(/\d/g,function(a,b,c,d){ console.log("a:",a);// 匹配 ...
- 126B Password[扩展kmp学习]
题目大意 给你一个字符串,求它的一个子串使得这个子串即使前缀又是后缀又出现在不是前缀且不是后缀的地方 分析 扩展kmp就是定义z[i]表示i~n的子串与整个串的最长公共前缀的长度是z[i] 所以这个题 ...
- :nth-child 与 ;nth-of-child
//:nth-child:是选择父元素下的第几个元素,不分标签类别,计数从1开始 //:nth-of-type:是选择父元素下的同类型元素的第几个元素.区分标签类别,计数从1开始