文档章节

【转载】Bash Magic

摩云飞
 摩云飞
发布于 2016/03/28 10:13
字数 1337
阅读 27
收藏 0


【变量定义】

var 无定义时取值 hello
[root@Betty ~]$ echo ${var}

[root@Betty ~]$ echo ${var-hello}
hello
[root@Betty ~]$ echo ${var:-hello}
hello
var 无定义时取值 hello 且赋值为 hello
[root@Betty ~]$ echo ${var=hello}
hello
[root@Betty ~]$ echo ${var:=hello}
hello
[root@Betty ~]$ echo ${var}
hello
var 有定义时取值 $var
[root@Betty ~]$ echo ${var-bye}
hello
var 有定义时取值 bye
[root@Betty ~]$ echo ${var+bye}
bye
[root@Betty ~]$ echo ${var:+bye}
bye

【内部变量】
echo $#          # 参数个数
echo $*          # 所有参数
echo $@          # 所有参数
echo $?          # 上次执行命令返回值
echo $$          # 当前 shell 的进程标识符
/bin/true &      # 用 & 将一个命令放到后台执行
echo $!          # 最后一个用 & 后台执行的命令的进程标识符
echo $0          # 当前 shell 脚本的名称
echo $1          # 第一个参数
args=$#          # 将 args 赋值为参数个数
echo ${!#}       # 最后一个参数
echo ${!args}    # 最后一个参数

【字符串截取】

定义字符串
[root@Betty ~]$ var=http://heylinux.com/archives/3668.html
显示字符串中的字符数量
[root@Betty ~]$ echo ${#var}

# 号截取,删除左边字符,保留右边字符;
其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符;
即删除 http://
[root@Betty ~]$ echo ${var#*//}
heylinux.com/archives/3668.html
## 号截取,删除左边字符,保留右边字符;
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符;
即删除 http://heylinux.com/archives/
[root@Betty ~]$ echo ${var##*/}
.html
% 号截取,删除右边字符,保留左边字符;
%/* 表示从右边开始,删除第一个 / 号及右边的字符;
[root@Betty ~]$ echo ${var%/*}
http://heylinux.com/archives
%% 号截取,删除右边字符,保留左边字符;
%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符;
[root@Betty ~]$ echo ${var%%/*}
http:
从左边第几个字符开始,及字符的个数;
其中的 0 表示左边第一个字符开始,5 表示字符的总个数;
[root@Betty ~]$ echo ${var:0:5}
http:
从左边第几个字符开始,一直到结束;
其中的 7 表示左边第八个字符开始,一直到结束;
[root@Betty ~]$ echo ${var:7}
heylinux.com/archives/3668.html
从右边第几个字符开始,及字符的个数;
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数;
[root@Betty ~]$ echo ${var:0-7:3}
68.
从右边第几个字符开始,一直到结束;
[root@Betty ~]$ echo ${var:0-7}
68.html

【字符串替换】

重新定义字符串,方面下面的替换操作
[root@Betty ~]$ var=http://heylinux.com/tag1/tag2/tag3/3668.html
将字符串中的第一个 tag 替换为 page
[root@Betty ~]$ echo ${var/tag/page}
http://heylinux.com/page1/tag2/tag3/3668.html
将字符串中的所有 tag 替换为 page
[root@Betty ~]$ echo ${var//tag/page}
http://heylinux.com/page1/page2/page3/3668.html
将字符串中的第一个 tag 替换为空字符串(即删除)
[root@Betty ~]$ echo ${var/tag}
http://heylinux.com/1/tag2/tag3/3668.html
将字符串中的所有 tag 替换为空字符串(即删除)
[root@Betty ~]$ echo ${var//tag}
http://heylinux.com/1/2/3/3668.html
将字符串中的前缀 http 替换为 ftp
[root@Betty ~]$ echo ${var/#http/ftp}
ftp://heylinux.com/tag1/tag2/tag3/3668.html
将字符串中的后缀 html 替换为 php
[root@Betty ~]$ echo ${var/%html/php}
http://heylinux.com/tag1/tag2/tag3/3668.php

【判断与运算】

echo $(date +%Y%m%d).gz   # 将命令执行结果作为变量值使用 
echo $((4+2*(8-1*6)-4/2)) # 加减乘除混合运算 

echo {1..10} # 数字 1 到 10 的 range 
echo {a..f}  # 字母 a 到 f 的 range
条件判定
[ $var != "no" ] && echo "cool.1"  # 脆弱的实现,当 var 无定义时会报告语法错误
[ $num -ne 5 ] && echo "yeah.1"    # 脆弱的实现,当 num 无定义时会报告语法错误

[ "$var" != "no" ] && echo "cool.2"   # 健壮的实现,当 var 无定义时仍能进行判断
[[ $var != "no" ]] && echo "cool.3"   # 健壮的实现,当 var 无定义时仍能进行判断
[[ "$var" != "no" ]] && echo "cool.4" # 更健壮的实现,当 var 无定义时仍能进行判断
[[ $num -ne 5 ]] && echo "yeah.2"     # 健壮的实现,当 num 无定义时仍能进行判断

数组的实现
array=(
array_value1
array_value2
array_value3
)
动态增加数组元素
array+=(arrary_new1)
array+=(arrary_new2)
array+=(arrary_new3)
echo ${array[*]}
数组信息查看
echo ${array[0]}  # 数组中第一个值
echo ${array[@]}  # 数组中所有值
echo ${array[*]}  # 数组中所有值
echo ${#array[*]} # 数组中值个数
echo ${#array[@]} # 数组中值个数

字典的实现
declare -A dict=(
["dict_key1"]="dict_value1"
["dict_key2"]="dict_value2"
)
字典信息查看
echo ${dict["dict_key1"]} # 字典中第一个值
echo ${dict[@]}           # 字典中所有值
# 普通赋值操作
a=a+5
echo $a
# 算术型赋值操作
let b=b+5
echo $b
# 更健壮的算术型赋值操作
let "c += 5"
echo $c
# 命令生成器,避免变量与语法的混乱
maxnum=100
logfile=/var/log/httpd/access_log
awk '{print $1}' ${logfile} |sort |uniq -c |awk '($1 > ${maxnum}){print $2}'
# 在上面的命令中第二个 awk 的单引号会导致 ${maxnum} 无法被解析为 100 ,从而导致语法错误
# 正确的做法应该是先将命令生成好,然后再通过 eval 执行,如下所示:
command="awk '{print \$1}' ${logfile} |sort |uniq -c |awk '(\$1 > ${maxnum}){print \$2}'"
eval ${command}
# 通过变量PIPESTATUS获取管道命令每一层的返回值
lsof | grep access_log | grep -v httpd
return_codes=(${PIPESTATUS[*]})
echo ${return_codes[*]}
# 通过 while 命令循环按行获取多个参数
while read param1 param2 param3; do
  echo ${param1}
  echo ${param2} ${param3}
done < <(echo -e "A B C\n 1 2 3")


本文转载自:http://ju.outofmemory.cn/entry/181117

摩云飞
粉丝 371
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
Parted Magic 2014_09_29 发布

Parted Magic 2014_09_29 发布,更新包括: bash/bash-4.3.026-i486-1.txz: Upgraded. lxpanel/lxpanel-0.6.2-i486-1_pmagic.txz: Upgraded. mdadm/mdadm-3.3.2-i486-1_pmagic.txz: Upgraded......

oschina
2014/10/07
723
0
Spring Boot Executable jar/war 原理

spring boot executable jar/war spring boot里其实不仅可以直接以 的方式启动,还可以把jar/war变为一个可以执行的脚本来启动,比如。 把这个executable jar/war 链接到下面,还可以变为lin...

横云断岭
2018/12/09
0
0
Parted Magic 2014_11_19 发布,Linux 磁盘分区

Parted Magic 2014_11_19 发布,主要改进内容如下: audacious/audacious-3.3.4-i486-1_pmagic.txz: Rebuilt. audacious-plugins/audacious-plugins-3.3.4-i486-1_pmagic.txz: Rebuilt. bash......

oschina
2014/12/22
1K
2
python 文本编码识别 file magic有时候不准

试了用magic模块,但是有的文件里面是中文的(notepad++打开显示为unix ansi ,notepad++能正常打开显示),却被magic判断为"ISO 8859-1"。而用python chardet模块识别后,该文本内容编码为“...

kjpioo
2013/07/27
0
0
TIOBE 2014年11月编程语言排行榜 R跃升至12位

TIOBE 2014 年 11 月编程语言排行榜今天发布,前三名仍然没有变化,C、Java、Objective-C。但因为大数据的炒作,本月R跃升至12位,上个月排名15。 TIOBE 编程语言社区排行榜是编程语言流行趋...

frankphper
2014/11/09
9.9K
21

没有更多内容

加载失败,请刷新页面

加载更多

面向对象方面的一些东东

<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" cont......

流年那么伤
24分钟前
2
0
git 过滤文件夹和文件(IDEA)

最近使用git版本管理工具遇到一件很烦的事情,commit时总会把.idea、.*.iml和target文件添加进来,实际开发中,这些是需要过滤掉的。在.gitnore文件添加了过滤不起作用。下面介绍一种成功过滤...

uug
32分钟前
2
0
Spark Streaming 实时统计商户当日累计PV流量

一、问题 对实时流量日志过滤筛选商户流量,对每个商户的流量进行累计,统计商户实时累计流量。 当时间超过24时时,重新统计当日商户的实时累计流量。 二、实现步骤 1、采用Spark Streaming...

boonya
37分钟前
2
0
如果Task与Event 创建了记录类型后,不出现在Lightning的Activities中

如果在Lightning的Activities没出现这两个Button,但是在页面布局的Lightning 按钮区也存在,全局操作的记录类型就需要选择一个,否则不会出现

在山的那边
45分钟前
2
0
ddd中的子域和界限上下文

我们先来说说子域是什么?子域在我的理解是在一个庞大的系统中可以明显感知的不同的区块,如果在电商模块中,商品目录,订单,物流,库存,发票等等都可以感知他们明显的不同,可以认为是子域...

算法之名
55分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部