shell

shell俗称壳(用来区别于核),是指提供使用者使用界面的软件(命令解析器),其接收用户命令,然后调用相应的应用程序。同时shell又是一种程序设计语言,作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。可以通过查看/etc/shells中的对应文件得知当前Linux系统中安装的各种shell。
bash -version 命令可以查看当前shell的版本号。|

复杂逻辑判断:-a (与)              -o(或)               ! (非)

字符串截取的5种方法:
假设有变量 var=http://www.aaa.com/123.html
1、#号截取或者##号截取,删除左边字符,保留右边字符。
echo ${var#*//}
 *// 从左边开始删除第一个 // 号及左边的所有字符
结果 :www.aaa.com/123.html

echo ${var##*/}
##*/ 从左边开始删除最后一个 / 号及左边的所有字符
结果: 123.html
2、%号截取或者%% 号截取,删除右边字符,保留左边字符。
echo ${var%/*}
%/* 从左边开始,删除最后一个 / 号及右边的所有字符
结果:http://www.aaa.com

echo ${var%%/*}
 %%/* 从左边开始,删除第一个 / 号及右边的所有字符
结果:http:
3、 使用${...}表达式
格式:${var1:起始位置:截取长度}
例如:
echo ${var:0:5}:0表示左边第一个字符开始,5 表示字符的总个数。结果:http:
echo ${var:7}:7表示左边第八个字符开始,一直到结束。结果 :www.aaa.com/123.html
echo ${var:0-8:3}:0-8表示右边算起第八个字符开始,3 表示字符的个数。结果:123
echo ${var:0-8}:表示从右边第八个字符开始,一直到结束。结果:123.html
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)
字符串替换:
格式1:${var/pattern/string}   只替换第一个
格式2:${var//pattern/string}   替换所有
把变量var中与pattern匹配的字符串替换为string。例:
dest=${var//\\/\/}   ##把\替换成/,这里用了转义字符\
字符串判断:
str1 = str2 (当两个串相等时为真)
str1 != str2 (当串str1和str2不等时为真)
-n str1 (str1非空时为真)
str1( str1非空时为真)
-z str1 (str1为空时为真)
另:变量str="this is a string"
判断str中是否含有"this"这个字符串,方法如下(注意2处空格!):
[[ $str =~ "this" ]] && echo "\$str contains this"
[[ $str =~ "that" ]] || echo "\$str does NOT contain this"
其实这里就是用到了"[[" 判断命令和 "=~"正则式匹配符号
或条件判断:
if [ -z $var1 ] || [ -z $var2 ] || [ -z $var3 ]    ##判断变量var..是否为空,如果为空,返回0

整数运算操作:
1、使用expr:expr 数值1 操作符 数值2
2、使用$[...]:$[数值1 操作符 数值2]

小数运算操作:利用管道,将表达式给命令bc处理:

几个数值处理技巧:
变量的递增:   格式1:let 变量名 ++              格式1:let 变量名 --
生成数字序列:格式1:seq 首数 末数              格式2:seq 首数 增量 末数
使用随机数:RANDOM变量

shell整型变量自增的5种方法:
a=$(($a+1))
a=$[$a+1]
a=`expr $a + 1`
let a++
((a++))
整数的比较:
int1 -eq int2 (两数相等为真 )
int1 -ne int2(两数不等为真 )
int1 -gt int2 (int1大于int2为真 )
int1 -ge int2 (int1大于等于int2为真 )
int1 -lt int2 (int1小于int2为真 )
int1 -le int2 (int1小于等于int2为真)

if条件判断:
1、正则匹配
if [[ $var =~ ^abc|hhh|sss ]] ; then
    命令序列1
else
     命令序列2
fi
2、通配符
if [ "$var"x == "a"x ] || [ "$var"x = "b"x ] ; then
    命令序列1
elif [ ... ] ; then
    命令序列2
else
    命令序列n
fi

for 循环,语句结构:
for 变量名 in 取值列表
do
    命令序列
done

while 循环,语句结构:
while [ 条件 ]  ##注意!! [ 的两边都有空格
do
......
done
例如(循环同步代码):
echo "======sync starting======"
repo sync
while [ $? -ne 0 ]
do
du -sh >> aaa.txt
sleep 5
echo "======sync failed,sync restarting====="
repo sync
done

案例一:批量添加用户账号
1.用户列表文件users.txt,每行一个
2.将初始口令设为12345,首次登录后必须修改密码
--stdin选项用于 从标准输入 管道读入新的密码

案例二:检测一个IP范围的主机状态
1.192.168.4.1——192.168.4.5
2.根据是否ping通来判断



set -o pipefail
对于set命令-o参数的pipefail选项,linux是这样解释的:
"If set, the return value of a pipeline is the value of the last (rightmost) command to exit with a  non-zero  status,or zero if all commands in the pipeline exit successfully.  This option is disabled by default."
设置了这个选项以后,包含管道命令语句的返回值为最后一个返回非零命令的返回值(非零)。或者返回零,如果管道命令包含的所有命令都执行成功。请看以下实例:


# 设置了set -o pipefail,返回从右往左第一个非零返回值


# 没有set -o pipefail,默认返回最后一个管道命令的返回值(无法确定这个管道命令是否全部执行成功)。

set -o errexit
shell 脚本中 :  set -x 是开启,  set +x是关闭  
set -e  表示有报错即退出, set  +e  表示关闭这种设置。  set -e 等价于 set -o errexit ,  set  +e 等价于 set  +o errexit 。 

#!/bin/bash
set -e
set -o pipefail
cat ./a.txt | echo "hello";echo $?
echo "**************************"
cat ./a.txt | echo "hello";echo ${PIPESTATUS[@]}

set -o pipefail
set -e (set -o errexit)
可以在编译出错的时候停止编译!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值