shell

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

字符串截取的5种方法:
假设有变量 var=http://www.aaa.com/123.htm.
1.#号截取,# 号是运算符,*代表所有,删除左边字符,保留右边字符。
echo ${var#*//}
 其中 var 是变量名,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm
2.##号截取,删除左边字符,保留右边字符。
echo ${var##*/}
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.aaa.com/
结果是 123.htm
3. %号截取,删除右边字符,保留左边字符
echo ${var%/*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.aaa.com
4. %% 号截取,删除右边字符,保留左边字符
echo ${var%%/*}
 %%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:
5. 使用${...}表达式
格式:${var1:起始位置:截取长度}
例如:
echo ${var:0:5}:0表示左边第一个字符开始,5 表示字符的总个数。结果:http:
echo ${var:7}:7表示左边第8个字符开始,一直到结束。结果 :www.aaa.com/123.htm
echo ${var:0-7:3}:0-7表示右边算起第七个字符开始,3 表示字符的个数。结果:123
echo ${var:0-7}:表示从右边第七个字符开始,一直到结束。结果:123.htm
注:(左边的第一个字符是用 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_第1张图片
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语句结构:
if [ ... ]          ##条件测试
    then 命令序列
fi
2、双分支if语句结构:
if [ ... ]
    then 命令序列1
    else 命令序列2
fi
3、多分支if语句结构:
if [ ... ]
    then 命令序列1
elif [ ... ]
    then 命令序列2
......
else 命令序列n
fi

for 循环,语句结构:
for 变量名 in 取值列表
do
    命令序列
done
案例一:批量添加用户账号
1.用户列表文件users.txt,每行一个
2.将初始口令设为12345,首次登录后必须修改密码
--stdin选项用于 从标准输入 管道读入新的密码
shell_第2张图片
案例二:检测一个IP范围的主机状态
1.192.168.4.1——192.168.4.5
2.根据是否ping通来判断
/dev/null表示空设备,这里就是把日志记录到空设备里,就是不记录日志,Null 是一特殊指标值(或是一种物件参照 reference)表示这个指标并不指向任何的物件。是一个特殊的文件,写入到它的内容都会被丢弃,如果尝试从该文件读取内容,那么什么也读不到。 /dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出“的效果。
shell_第3张图片
shell_第4张图片

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."
设置了这个选项以后,包含管道命令语句的返回值为最后一个返回非零命令的返回值(非零)。或者返回零,如果管道命令包含的所有命令都执行成功。请看以下实例:
shell_第5张图片
shell_第6张图片
# 设置了set -o pipefail,返回从右往左第一个非零返回值
shell_第7张图片
shell_第8张图片
# 没有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 。 
shell_第9张图片

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

你可能感兴趣的:(shell,linux)