shell编程基础

shell编程

#!/bin/sh
#1.输出格式
values="$values"
echo ${values}

#2.单引号与双引号区别
#双引号会对要输出的内容进行解析,而单引号只会原样输出
s1=10
s2=20
echo "He is $s1 years old"
echo 'He is $s2 years old'


#3.引用命令
#ls :查看当前目录中的文件和目录
#ls -l : 以长格式显示当前目录中的文件和目录
m1=`ls`
m2=$(ls -l)
echo $m1
echo $m2


#4.删除变量
age=18
echo "He is ${age} years old"
unset age
echo "He is ${age} years old"
#只读变量不可删除
readonly age=18
#unset: age: 无法反设定: 只读 variable
unset 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 $*
for i in "$*"; do
  echo $i
done
#查看传递到脚本的参数,循环输出可以分别返回各个参数
echo $@
for i in "$@"; do
  echo $i
done


#6.字符串
#三种表现形式
n=18
str1="shell  ${n}"
#单引号原样输出
str2='shell \"script\" ${n}'
#有解析效果;字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。
str3=shell\"script\"${n}
echo $str1
echo $str2
echo $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 d
for i in "${list[*]}";
do
  echo $i
done

#a
#b
#c
#d
for i in "${list[@]}";
do
  echo $i
done

# 关联数组
#Bash 支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。
#第一种定义方式
declare -A site=(['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=`expr 2 + 2`
echo $a
echo `expr 2 - 1`
#注:对“*”的特殊处理
echo `expr 2 \* 2`
echo `expr 2 '*' 2`
echo `expr 5 / 2`
echo `expr 5 % 2`
echo --------------------------
echo $((2-1))
echo $((2*2))
echo $((5/2))
echo $((2%1))
echo --------------------------
a=1
b=2
echo {[ $a == $b ]}
echo {[ $a != $b ]}
if [ $a == $b ];
then
    echo 'a=b'
fi
if [ $a != $b ];
then
    echo 'a!=b'
fi


#9.关系运算符
a=10
b=20
#-eq 二者相等则返回true
if [ $a -eq $b ];
then
  echo 'a等于b'
else
  echo 'a不等于b'
fi
#-ne 二者不相等则返回true
if [ $a -ne $b ];
then
  echo 'a不等于b'
else
  echo 'a等于b'
fi
#-gt a>b 则返回true
if [ $a -gt $b ];
then
  echo 'a大于b'
else
  echo 'a不大于b'
fi
#-ge a>=b 则返回true
if [ $a -ge $b ];
then
  echo 'a大于等于b'
else
  echo 'a不大于等于b'
fi
#-lt a<b 则返回true
if [ $a -lt $b ];
then
  echo 'a小于b'
else
  echo 'a不小于b'
fi
#-le a<=b 则返回true
if [ $a -le $b ];
then
  echo 'a小于等于b'
else
  echo 'a不小于等于b'
fi

# bool运算符 -o 或 , -a 与 , ! 非
if [ $a -lt 20 -o $b -ge 10 ];
then
    echo 'a小于20或b大于等于10'
fi

# 逻辑运算符 && 逻辑于 || 逻辑或
if [[ $a -gt 20 && $b -lt 20 ]];
then
    echo "a大于20并且b小于20"
else
    echo "a大于20并且b小于20 不成立"
fi

# 字符串运算符
if [ $a = $b ];
then
    echo 'a=b'
else
    echo "a!=b"
fi

c='daoism'
#-z 检测字符串的长度,为0则返回true
if [ -z $c ];
then
    echo "$c 值是0个"
fi
#-n 检测字符串的长度,不为0则返回true
if [ -n $c ];
then
    echo "$c 值不是0个"
fi

# 文件测试运算符
file='/root/shell_code/demo7.sh'
#检测文件(包括目录)是否存在,若存在则返回true
if [ -e $file ];
then
    echo "$file is exist"
fi


#10.read 读取变量
# -e开启转义,echo自带换行
echo -e "ok \n"
echo
echo "ok \n"

read -p "inter your info " name age gender
echo "$name $age $gender"

if read -t 20 -sp "please enter your passwd > " pass1 && printf "\n" &&
    read -t 20 -sp "please enter your passwd again > " pass2 && printf "\n" &&
    [ $pass1 == $pass2 ];
then
    echo "valid password"
else
    echo "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.88

printf "%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"` -gt 1 ] ; then echo 'yes' ; fi

a=20
b=10
#if else 的 [...] 判断语句中大于使用 -gt,小于使用 -lt
#如果使用 ((...)) 作为判断语句,大于和小于可以直接使用 > 和 <
if (( a > b ));
then
    echo "a>b"
else
    echo "a<=b"
fi

if (( $a == $b ));
then
    echo 'a=b'
elif (( $a > $b ))
then   
    echo 'a>b'
else
    echo "a<b"
fi
  • 20
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值