#!/bin/sh#1.输出格式values="$values"echo${values}#2.单引号与双引号区别#双引号会对要输出的内容进行解析,而单引号只会原样输出s1=10s2=20echo"He is $s1 years old"echo'He is $s2 years old'#3.引用命令#ls :查看当前目录中的文件和目录#ls -l : 以长格式显示当前目录中的文件和目录m1=`ls`m2=$(ls-l)echo$m1echo$m2#4.删除变量age=18echo"He is ${age} years old"unset age
echo"He is ${age} years old"#只读变量不可删除readonlyage=18#unset: age: 无法反设定: 只读 variableunset age
echo"He is ${age} years old"#5.传递参数#外部执行sh test.sh a b c
#内部定义#打印传递参数的文件echo$0#传递的第一个参数echo$1#传递的第二个参数echo$2#传递的第三个参数echo$3#传递第12个参数echo${12}#查看传递到脚本的参数的个数echo$##查看传递到脚本的参数,以一个字符串显示echo$*foriin"$*";doecho$idone#查看传递到脚本的参数,循环输出可以分别返回各个参数echo$@foriin"$@";doecho$idone#6.字符串#三种表现形式n=18str1="shell ${n}"#单引号原样输出str2='shell \"script\" ${n}'#有解析效果;字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。str3=shell\"script\"${n}echo$str1echo$str2echo$str3#获取str1的字符串长度echo${#str1}#字符串拼接name="shell"str="ww.baidu.com"#这样拼接时中间不能有空格result1=${name}${str}echo${result1}#如果有双引号则可有空格result2="${name}${str}"echo${result2}#中间可以有别的字符串result3=${name}":"${str}echo${result3}#字符串的截取a="Lihua is 18 years old"# echo ${syh:start:length} 是length不是结束位置,length是要截取的长度echo${a:0:4}# 省略length表示取到结尾echo${a:0}# 负数索引 还是从右边开始取值# ${str:0-start:length}; 倒数第五个位置为"s",从其开始截取到"l", "s ol"echo${a:0-5:4}# 指定子字符串开始截取,"#"是截取右边的方法(从左边开始匹配,取剩下的)#"*"指匹配任意字符# ${str#*substr} 一般会匹配到第一个字串 如果不确定字串是否是第一个 可以尽可能的多写字串 匹配完了,只取剩下的#结果为“18 years old” 、 “old”echo${a#*is}#从最后一次匹配到“s”的位置开始,取右边剩余的数据echo${a##*s}# 指定子字符串开始截取 截取左边的方法(从右边开始匹配,取剩下的)#结果为“Lihua ”echo${a%is*}#7.数组,只支持一维数组list=(a b c d)#输出第一个元素echo${list[0]}# 获取数组的长度echo${#list[*]}#直接输出, 二者输出形式相同echo${list[*]}echo${list[@]}# 取数组所有值 list[*] list[@]#遍历输出#a b c dforiin"${list[*]}";doecho$idone#a#b#c#dforiin"${list[@]}";doecho$idone# 关联数组#Bash 支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。#第一种定义方式declare-Asite=(['google']='www.google.com'['taobao']='www.taobao.com')echo${site['google']}#第二种定义方式declare-A site2
site2['google']='www.google.com'
site2['taobao']='www.taobao.com'echo${site['google']}#8.算数运算符# +号周围需要空格a=`expr2 + 2`echo$aecho`expr2 - 1`#注:对“*”的特殊处理echo`expr2\* 2`echo`expr2'*'2`echo`expr5 / 2`echo`expr5 % 2`echo --------------------------
echo$((2-1))echo$((2*2))echo$((5/2))echo$((2%1))echo --------------------------
a=1b=2echo{[$a==$b]}echo{[$a!=$b]}if[$a==$b];thenecho'a=b'fiif[$a!=$b];thenecho'a!=b'fi#9.关系运算符a=10b=20#-eq 二者相等则返回trueif[$a-eq$b];thenecho'a等于b'elseecho'a不等于b'fi#-ne 二者不相等则返回trueif[$a-ne$b];thenecho'a不等于b'elseecho'a等于b'fi#-gt a>b 则返回trueif[$a-gt$b];thenecho'a大于b'elseecho'a不大于b'fi#-ge a>=b 则返回trueif[$a-ge$b];thenecho'a大于等于b'elseecho'a不大于等于b'fi#-lt a<b 则返回trueif[$a-lt$b];thenecho'a小于b'elseecho'a不小于b'fi#-le a<=b 则返回trueif[$a-le$b];thenecho'a小于等于b'elseecho'a不小于等于b'fi# bool运算符 -o 或 , -a 与 , ! 非if[$a-lt20-o$b-ge10];thenecho'a小于20或b大于等于10'fi# 逻辑运算符 && 逻辑于 || 逻辑或if[[$a-gt20&&$b-lt20]];thenecho"a大于20并且b小于20"elseecho"a大于20并且b小于20 不成立"fi# 字符串运算符if[$a=$b];thenecho'a=b'elseecho"a!=b"fic='daoism'#-z 检测字符串的长度,为0则返回trueif[-z$c];thenecho"$c 值是0个"fi#-n 检测字符串的长度,不为0则返回trueif[-n$c];thenecho"$c 值不是0个"fi# 文件测试运算符file='/root/shell_code/demo7.sh'#检测文件(包括目录)是否存在,若存在则返回trueif[-e$file];thenecho"$file is exist"fi#10.read 读取变量# -e开启转义,echo自带换行echo-e"ok \n"echoecho"ok \n"read-p"inter your info " name age gender
echo"$name$age$gender"ifread-t20-sp"please enter your passwd > " pass1 &&printf"\n"&&read-t20-sp"please enter your passwd again > " pass2 &&printf"\n"&&[$pass1==$pass2];thenecho"valid password"elseecho"invalid password"fi#11.printf命令#%s %c %d %f 都是格式替代符,%s 输出一个字符串,#%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。#%-10s 指一个宽度为 10 个字符#%-4.2f 指格式化为小数,其中 .2 指保留2位小数printf"%-10s %-8s %-4.2f\n" lihua male 140.88printf"%s %s %s\n" a b c d e f g h i j
#输出结果为:
a b c
d e f
g h i
j
#12.if判断#ps -ef | grep -c "ssh" 获取名字中含有“ssh”的进程的数量if[`ps-ef|grep-c"ssh"`-gt1];thenecho'yes';fia=20b=10#if else 的 [...] 判断语句中大于使用 -gt,小于使用 -lt#如果使用 ((...)) 作为判断语句,大于和小于可以直接使用 > 和 <if(( a > b ));thenecho"a>b"elseecho"a<=b"fiif(( $a == $b ));thenecho'a=b'elif(( $a > $b ))thenecho'a>b'elseecho"a<b"fi