bash常识
条件判断
判断是否为空 -z,尽量不要使用-n
运算符 | 含义( 满足下面要求时返回 TRUE ) |
---|---|
-e file | 文件 file 已经存在 |
-f file | 文件 file 是普通文件 |
-s file | 文件 file 大小不为零 |
-d file | 文件 file 是一个目录 |
-r file | 文件 file 对当前用户可以读取 |
-w file | 文件 file 对当前用户可以写入 |
-x file | 文件 file 对当前用户可以执行 |
-g file | 文件 file 的 GID 标志被设置 |
-u file | 文件 file 的 UID 标志被设置 |
-O file | 文件 file 是属于当前用户的 |
-G file | 文件 file 的组 ID 和当前用户相同 |
-z var | var未定义,或var为空字符串 |
-n var | zws: var代表的字符串长度不为0 |
file1 -nt file2 | 文件 file1 比 file2 更新 |
file1 -ot file2 | 文件 file1 比 file2 更老 |
否定条件:if [ ! expresssion ]
字符串操作
字符串变量的截取操作
echo ${str##a*c} ##(#)代表从左边裁掉最长(短)匹配,%%(%)代表从右边裁掉最长(短)匹配
字符串替换
str=“apple, tree, apple tree”
- echo ${str/apple/APPLE} # 替换第一次出现的apple
- echo ${str//apple/APPLE} # 替换所有apple
- echo ${str/#apple/APPLE} # 如果字符串str以apple开头,则用APPLE替换它
- echo ${str/%apple/APPLE} # 如果字符串str以apple结尾,则用APPLE替换它
字符串比较
[[ “a.txt” == a* ]] # 逻辑真 (pattern matching)
[[ “a.txt” =~ .*.txt ]] # 逻辑真 (regex matching)
[[ “abc” == “abc” ]] # 逻辑真 (string comparision)
[[ “11” < “2” ]] # 逻辑真 (string comparision), 按ascii值比较
取长度
str=“abcd”
expr length $str # 4
echo KaTeX parse error: Expected '}', got '#' at position 2: {#̲str} # 4
…str" : “.*” # 4
好像一般使用第二种
查找子串的位置
str=“abc”
expr index $str “a” # 1
expr index $str “b” # 2
expr index $str “x” # 0
expr index $str “” # 0
选取子串
str=“abcdef”
expr substr “KaTeX parse error: Expected 'EOF', got '#' at position 11: str" 1 3 #̲ 从第一个位置开始取3个字符,…str” 2 5 # 从第二个位置开始取5个字符, bcdef
expr substr “$str” 4 5 # 从第四个位置开始取5个字符, def
echo ${str:2} # 从第二个位置开始提取字符串, bcdef
echo ${str:2:3} # 从第二个位置开始提取3个字符, bcd
# 位置的可以是负数,表示倒数第几个字符
fork, exec, source
来源 http://mindream.wang.blog.163.com/blog/static/2325122220084624318692/
fork
( /directory/script.sh)
fork是最普通的, 就是直接在脚本里直接调用另一脚本.
运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。
sub-shell执行完毕后返回parent-shell.
sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell
exec
(exec /directory/script.sh)
exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本. 被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别
source
(source /directory/script.sh,或". xxx")
与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.
补充
fork: 在脚本中直接调用子脚本,如./sub-script,不继承parent-shell中未export的变量
exec: 在脚本中使用exec调用子脚本,如exec ./sub-script,不继承未export的变量
source: 在脚本中使用source调用子脚本,如source ./sub-script,继承未export的变量
export VAR=‘v’
等效于
VAR=‘v’
export VAR
其他
bash按颜色显示
http://tieba.baidu.com/p/2344083142
反相显示
echo -e "\033[7mHighlight text\033[0mNormal text"
bash常识的更多相关文章
- SHELL脚本编程的常识和VI常用技巧
来源:http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM#_Toc3751808 ...
- scp报错 -bash: scp: command not found
环境:RHEL6.5 使用scp命令报错: [root@oradb23 media]# scp /etc/hosts oradb24:/etc/ -bash: scp: command not fou ...
- bash字符串操作
参考 http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 问题:bash怎么提取字符串的最后一位?例如python中strin ...
- grep 查找bash脚本中的注释代码
出于安全性的考虑,不建议在bash脚本中注释掉不使用的代码.也就是说如果某段代码不使用了,那么应该删除掉,而不是简单地注释掉.假如你突然意识到这一点,而以前并没有遵从这个原则,现在需要找出脚本中的注释 ...
- Bash 脚本编程语言中的美学与哲学
我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨 Bash 脚本语言中的美学与哲学. 这不是一篇 Bash 脚本编程的教程,但是却能让人更加深入地了解 Bash ...
- cmder git bash 使用
cmder 是一款 windows 下的命令集合软件,它可以集合各种系统下的命令,并且操作非常快速方便. 安装有两个版本,一个是简化版(4.27M),一个是完全版(75.7M),它们的唯一区别:完全版 ...
- 安装完成后在命令行运行bash时报错0x80070057
在命令运行bash 提示如下: 解决方法,不启用旧版本控制台: 右键命令提示栏 打开属性,把勾选去掉如下图红色边框标识: 然后重启,就可以使用,也包括可以打开Bash on Unbuntu on Wi ...
- Bash简明教程--变量
1. 前言 Bash是一门流行在*nix系统下的脚本语言.作为一门脚本语言,变量是一门语言的基本要素,在这篇教程中,我们将学习Bash中的变量是怎么表示的,以及变量相关的一些语法规则. 2. Bash ...
- 让BASH,VIM美美的Powerline
前言 鉴于BASH及其周边强大的工具以及VIM高效快捷,加上现在我工作重心转移到前端开发上,因此我华丽地转向Linux阵营(当然从最傻瓜式的Ubuntu开始啦!).但BASH和VIM默认样式确实颜值 ...
随机推荐
- java项目性能测试过程记录
一 准备环境和指标 1.主机三台(linux,这里显示的都是伪主机地址):最好用干净的机子,做性能测试的时候别装其他东西在上面跑. 100.22.0.98 部署自己的项目服务 100.22.0.9 ...
- VSTO:使用C#开发Excel、Word【3】
<Visual Studio Tools for Office: Using C# with Excel, Word, Outlook, and InfoPath >——By Eric C ...
- 4.8 C++ typeid操作符
参考:http://www.weixueyuan.net/view/6378.html 总结: typeid操作符用于判断表达式的类型,注意它和sizeof一样是一个操作符而不是函数. 如果需要使用t ...
- 在linux执行kettle
1.下载 最新版下载 7.1 https://community.hitachivantara.com/docs/DOC-1009855 2.准备 3.上传任务文件 .kjb,.ktr 4.上传mys ...
- Java伪代码之大道至简读后感
import.java.大道至简.*; import.java. 愚公移山.*; public class YuGongYiShan//定义一个名为YuGongYiShan的类 {//类定义的开始 S ...
- codeforce949A(顺带vector详细使用介绍)
A. Zebras time limit per test1 second memory limit per test512 megabytes inputstandard input outputs ...
- 小波学习之一(单层一维离散小波变换DWT的Mallat算法C++和MATLAB实现) ---转载
1 Mallat算法 离散序列的Mallat算法分解公式如下: 其中,H(n).G(n)分别表示所选取的小波函数对应的低通和高通滤波器的抽头系数序列. 从Mallat算法的分解原理可知,分解后的序 ...
- SpringSecurity入门例子及遇到的问题解决
最近学习<Spring 实战>学习到了SpringSecurity,觉得书本上的例子过于复杂,而且不喜欢它基于java配置,更喜欢用xml文件进行配置 于是在极客学院网上学习,感觉挺不错的 ...
- C# EditPlus环境设置
C# EditPlus环境设置 先要设置环境变量 5.0的 C:\Program Files\MSBuild\12.0\Bin 6.0的 C:\Windows\Microsoft.NET\Fra ...
- Python 带有参数的装饰器
def wrapper_out(flag): # 装饰器本身的参数 def wrapper(fn): # 目标函数 def inner(*args, **kwargs): # 目标函数执行需要的参数 ...