【转载】Bash Magic

【变量定义】 

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

时间: 2024-09-29 14:18:56

【转载】Bash Magic的相关文章

Linux下用bash命令执行名称中带有“(”符号的目录注意事项

  ***********************************************声明************************************************ 原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 表述有错误之处,请您留言或邮件(hyldba@163.com)指明,不胜感激. 本文转载必须保留此处:http://blog.csdn.net/huangyanlong/article/det

编译bash实现history的syslog日志记录

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1763145 一.编译BASH实现bash的syslog日志记录功能 1. 本文将通过bash软件实现history记录到syslog日志的功能,并通过该方式可以实现实时的传送到了远端的日志集中服务器上,可以实现操作目志的审计功能. 操作系统版本 : CentOS 6.5 x64 2. 安装6.5对应bash源码包 # w

linux bash 和 sh的区别

Linux 中的 shell 有很多类型,其中最常用的几种是: Bourne shell (sh).C shell (csh) 和 Korn shell (ksh), 各有优缺点.Bourne shell 是 UNIX 最初使用的 shell,并且在每种 UNIX 上都可以使用, 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell.Linux 操作系统缺省的 shell 是Bourne Again shell,它是 Bourne shell 的扩展,简称 Bas

Magic Leap,我等你到明年7月

    一家没有营收,也没有已经面世产品的科技公司,仅仅凭着一个雄心勃勃的愿景和一些尚未成熟的代码,就以120亿美元的估值,从投资者那里筹集到5.42亿美元的现金. 这就是Magic Leap. Google领投的巨额融资一下子让这个默默无闻的初创公司跻身到年轻技术公司中佼佼者的行列,也引得全世界的媒体都恨不得把Magic Leap的历史翻个底朝天. Magic Leap究竟是做什么的,它为什么能够吸引谷歌斥巨资赌注一个只有概念的新兴公司?宅客君将为你解密一个完整的Magic Leap. 谁是M

手把手教你:如何让Windows恋上Linux bash

4月7日,微软开始向用户推送Windows 10 biuld 14316预览版,该版本不仅在Cortana跨平台支持.Edge浏览器支持和虚拟桌面方面得到了优化,还能够原生支持Linux bash. 对现在的开发者来说,Linux已经是很多人必须的开发平台,在windows上不必借助虚拟机就能运行Bash,无疑有极大的吸引力. 但是微软并没有在最新版本Windows 10里直接内置Bash,需要开发者进行一些安装和设置工作.下面,笔者将会手把手教你,如何实现Ubuntu on Windows.

Bash代码注入安全漏洞{Cool}

Coolshell.cn [童鞋们,移步过去coolshell看吧,这里只是备份下,因为我觉得酷壳的文章表达都很清晰易懂,毫无赘述,而且语言流畅,我喜欢的我就想多备份下] 很多人或许对上半年发生的安全问题"心脏流血"(Heartbleed Bug)事件记忆颇深,这两天,又出现了另外一个"毁灭级"的漏洞--Bash软件安全漏洞.这个漏洞由法国GNU/Linux爱好者Stéphane Chazelas所发现.随后,美国电脑紧急应变中心(US-CERT).红帽以及多家从事

[Linux转载]Linux 操作

Linux操作命令集合 参考:http://www.cnblogs.com/rollenholt/archive/2012/09/01/2667184.html   正在运行的内核和系统信息 # uname -a # 获取内核版本(和BSD版本) # lsb_release -a # 显示任何 LSB 发行版版本信息 # cat /etc/SuSE-release # 获取 SuSE 版本 # cat /etc/debian_version # 获取 Debian 版本 使用 /etc/DIST

(转载)Kafka文件存储机制那些事

        转自<Kafka文件存储机制那些事>,by美团点评技术团队,地址:http://tech.meituan.com/kafka-fs-design-theory.html         分析的很不错,转载下来!          Kafka是什么 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志.访问日志,消息服务等等,Linkedin于20

BASH SHELL快速入门

BASH BASH的基本语法 最简单的例子--HelloWorld! 关于输入.输出和错误输出 BASH中对变量的规定(与C语言的异同) BASH中的基本流程控制语法 函数的使用 2.1 最简单的例子--HelloWorld! 几乎所有的讲解编程的书给读者的第一个例子都是HelloWorld程序,那么我们今天也就从 这个例子出发,来逐步了解BASH. 用vi 编辑器编辑一个hello文件如下: #!/bin/bash #Thisisaverysimpleexample echoHelloWorl