bash常识

时间:2024-01-06 11:53:20

条件判断

判断是否为空 -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"