Shell编程

变量:类型只有数字、字符串、数组

#!/bin/sh
str_name="jack"  #变量赋值,等号俩边不能有空格,比如str_name = "jack"、str_name= "jack"
echo $str_name
echo ${str_name}

readonly str_name  #定义只读,不带$
unset str_name  #删除变量,不带$

str_say = "hello, ${str_name} !"  #拼接字符串
str_say = "hello", ${str_name} !  #拼接字符串
str_say = hello, ${str_name} !  #拼接字符串

len = ${#str_say}    #获取字符串长度
len = ${#str_say[0]}  #获取字符串长度,一样效果

str_sub = ${str_name:1:3}   #字符串截取:${字符串:开始位置:截取长度},第一个字符的位置为 0

#数组:
arr=(a b 1 2 "cc")  #定义数组,shell只支持一维数组,没有多维数组;
echo ${arr[0]} ${arr[1]} ${arr[2]}  #读取数组,第一个位置为0
echo ${arr[@]}  #读取所有数组,使用@

len=${#array_name[@]}  #获取数组的长度,使用@
len=${#array_name[*]}  #获取数组的长度,使用*,效果一样

#关联数组
declare -A arr=(["aaa"]="111", ["bbb"]="222", ["ccc"]="333")  #定义关联数组,方法1
declare -A arr  #定义关联数组,方法2,先声明再赋值
arr["aaa"]="111"
arr["bbb"]="222"

echo ${arr["aaa"]}  #输出关联数组的元素
echo ${!site[@]}  #输出数组所有的键,加了个叹号
echo ${!site[*]}  #输出数组所有的键,效果一样

#遍历数组
for (( i=0; i<${#array[@]}; i++ ))
do
  echo ${array[i]};
done

#echo使用方法:
echo -e "OK! \n"   # -e 标识开启转义
echo "It is a test" > file  #把显示结果写入文件,覆盖原有内容
echo "It is a test" >> file  #把显示结果追加到文件末尾
echo '${name}'  #单引号内的原样输出
echo `ls -l`  #显示命令执行结果,使用反引号`


#算术运算:加+、减-、乘\*、除/、取余%
a=`expr 3 + 2`  #也可以这样写:a=$[3 + 2]
a=`expr $a - $b`  #也可以这样写:a=$[a - b]
a=`expr $a \* $b`  #乘法,需用\*

#关系运算:等于:-eq、==;  不等于:!=、-ne;  大于:-gt;  大于等于:-ge;  小于:-lt;  小于等于:-le

if [ $a == $b ] ……  #等于
if [ $a -eq $b ]……  #不等于
if [ $a -gt $b ]……  #大于
if [ $a -lt $b ]……  #小于

#逻辑运算:或:||,-o、  且:&&,-a、  非:!

if [ $a -lt 10 && $b -gt 15 ]……  #且运算
if [ $a -lt 10 -a $b -gt 15 ]……  #且运算
if [ $a -lt 10 || $b -gt 15 ]……  #或运算
if [ $a -lt 10 -o $b -gt 15 ]……  #或运算
if [  ! $a == 10 ]……  #非运算

#字符串的判断:-z:字符串长度是否为0、-n:字符串长度是否不为0、
if [ $str ]……  #字符串是否为空
if [ -z $str ]……  #字符串长度是否为0

#字符串的比较:= 、!=
if [ $str1 = $str2 ]……  #字符串是否 相等
if [ $str1 != $str2 ]……  #字符串是否 不相等

#文件检测(常用):-e是否存在、目录-d、文件-f、可读-r、可写-w、可执行-x
file="/var/1.txt"
if [ -e $file ]……  #是否存在
if [ -r $file ]……  #是否可读
if [ -w $file ]……  #是否可写
if [ -d $file ]……  #是否为目录


#使用test 取代 [ ],egg:
if test $a -eq $b … #相当于:if [ $a -eq $b ]
if test -e "/data/" …  #相当于:if [ -d "/data/" ]
if [ $a -lt 10 && $b -gt 15 ] …  #相当于:if  test $a -lt 10 && $b -gt 15 


#条件判断语句中,使用((...)) 取代[...],适用于变量比较,可以方便使用符号:> >= < <= ,取代字符:-gt -ge -lt -le,egg:
if (( $a > $b )) … #相当于:if [ $a -gt $b ]
if (( $a >= $b )) … #相当于:if [ $a -ge $b ]
if (( $a < $b )) … #相当于:if [ $a -lt $b ]
备注:if (( -e "/home/1.txt" )) 这样写是不可以的!只能用作变量比较!

expr用法:
echo `expr length $str_say`  #获取字符串长度;
echo `expr substr $str_say 3 2`  #字符串截取,后俩个数字表示:开始位置和截取长度,第一个字符的位置为 1;
echo `expr index $str_say "el"`  #查找字符位置,非字符串,如果输入字符串,只会查找第一个字符,比如查找"ello",实际只是查找字符e;


#流程控制:

if  (( $a > 1 ))
then
  echo 'a>1'
fi

if  (( $a > 1 ))
then
  echo 'a>1'
else

  echo 'a<=1'
fi

#for循环
for i in {1..10}
do
  echo "i=" i
done

for (( i=1; i<10; i++ ))
do
  echo "i=" i
done

#for循环:脚本命令

for i in  `ls -l`  #反引号里面是命令,也可以使用$(…),比如:for i in  $( ls -l )
do 
  echo "i=" i
done

#while循环
while (( $i < 10 ))

do
  echo $a
  let i++
done




其他:

read name  #从标准输入中读取一行,并把输入赋值给变量name;






 

posted on 2022-08-14 07:44  飞哥100  阅读(24)  评论(0编辑  收藏  举报

导航