一个例子学会shell脚本(第一章)

篇幅很长,记录待查。

一、变量

#变量分为二种方式:系统变量,自设变量,形式var=value 使用$var

echo $PATH  # PATH的内容
hello="hello world"
echo $hello  # hello world

#变量可以接受命令执行的结果,形式 var=$() 或 var=``

path=$(pwd)
files=`ls -al`
echo current path:$path
echo files:"$files"

#一个执行时间计算的案例

begin=$(date +%s) # date +%s格式化时间为秒制
sleep 2s
end=$(date +%s)
runtime=$((end-begin))

echo $runtime #  结果2

二、数学计算


expr 10+3 # 10+3
expr 10 / 3 # 3
expr 10 % 3 # 1
expr 10 \* 3 # 30

num1=$(expr 10 % 3)
num2=`expr 10 % 3`

echo $num1$num2

echo ..................忘记上面的方式
echo '采用 $[] $(())'
num1=3
num2=4
num3=$[$num1+$num2]
num4=$(($num1+$num2))
num5=$[3+4]
num6=$((3+4))
echo $num3$num4$num5$num6


echo '备注:字符串拼接可以用""(解析变量)或''(不解析变量)',加不加"在于是否有空格和特殊符
echo '比如 我在/etc/profile 内输入$PATH的字符串,如果用"就会解析$Path的内容
,但是实际上我们需要的是$Path字符串输入到/etc/profile内'

三、字符串截取等操作

#3.1 字符串截取
url="http://www.baidu.com/admin/index.html"
echo $url
echo "${url: 2: 3}"'截取2开始3个'
echo "${url: 0-12}"'截取最后开始12个'
echo "${#url}"'字符串长度'
echo "${url#*/}"'截取第一个/的右边'
echo "${url##*/}"'截取最后一个/的右边'
echo "${url%%/*}"'左边'
echo "${url%/*}"'左边'

#3.2 字符串替换
str=www.baidu.com.cn

echo ${str/\.//}'格式:${str/old_char/new_char}'
echo ${str//\.//}'格式: ${str//old_char/new_char}'

四、数组的操作 

nums=(24 22 55 66)
echo "数组所有元素"${nums[@]}
nums[4]=99
echo "数组所有元素"${nums[*]}
echo "数组第二个元素"${nums[1]}
echo "数组长度"${#nums[@]}

五、if语句

#1、接受命令参数为if条件(命令执行成功就执行)

if pwd
then
 echo '命令成功执行'
fi


#2、[]条件,使用时注意各种间隔,并且<>需要用-gt或-lt等
if [ $(ps -ef | grep -c "ssh") -gt 1 ];then echo "true"; fi


#3、[[]]条件,无视上一条注意点,但是一般用于字符串的比较。
var1=test1
var2=test2

if [[ $var1 < $var2 ]]
then
echo "var1小"
else
echo "var2小"
fi

#4、数字比较建议用 (())格式
var1=100
var2=200
if [ $var1 -lt $var2 ]
then
 echo 'var1小'
fi

var1=100
var2=200
if (($var1 < $var2))
then
 echo 'var1小'
fi

六 、for语句 和while语句


#1、采用(())常规模式
for((i=1;i<=10;i++))
do
echo $[$i * 3 + 1];
done

#2、采用 for var in arr 模式
for i in $(seq 1 10)
do
echo $[$i * 2 +1];
done


for i in `ls`
do
  echo $i is file name ;
done

#备注 字符串会用" "切割成数组遍历
list="abc bcd def efg"
for i in $list
do
  echo $i is appoint;
done



for f in $(ls *.sh)
do
 name=$(echo "$f" | awk -F. '{print $1}')
 echo $name;
done
# 累加操作
i=1

while(($i<100))
        do
        i=$(($i+1))
        echo $i
done

min=1
max=105
while [ $min -le $max ]
do
        echo $min
        min=$[$min+1]
done

#演示break 跳出循环

a=1
while [ $a -le 5 ]
do
   if [ $a -eq 3 ]
   then
       break
   fi
   echo "a=$a"
   a=$[$a+1]
done

 七、$特殊变量

#脚本内的参数获取

echo "文件全名是 $0"
echo "基础名称是 $(basename $0)"
echo "输入路径是 $(dirname $0)"
echo -n  "正确获取当前文件的绝对路径的目录:"
echo "$(cd "$(dirname "$0")";pwd)"

echo 第一个参数是$1
echo 第二个参数是$2
echo 第三个参数是$3
echo 所有的参数是$@
echo 参数长度是$#

for param in $@
do
  echo $param
done


# 方法内获取参数类似!!
myfn() {
 local sum=0
 echo "方法参数$1"
 echo "方法参数$2"
 echo "方法所有的参数$@"
 for param in $@
 do
   sum=$(( $param + $sum  ))
 done
 return $sum
}

echo ............

myfn 33 44 55
echo #获取方法返回值或者shell命令的返回值$?

八、方法(定义 fn() {}  使用 fn param1 param2 )

sumNums() {
 local sum=0;
 for i in $@
 do
  sum=$((sum+i))
 done
 return $sum
}


sumNums  1 2 3 4 5
echo $?


check() {
 local in=$1;
 if(( in < 100 ))
 then
        echo "lt 100"
 else
   echo "gt 100"
 fi
}

check 500

echo $?

echo ##############################
echo "下面演示的是文件本身作为命令时,退出状态值的演示"
echo  '在外部命令执行时,带一个参数,并且在外部用$? 接受结果'

out_param=$1
if [ -n "$out_param" ];then
if(( $out_param < 100 ))
then
exit 0
else
exit 1
fi

九、read读取输入

# 读取输入的y或n
echo -n "please write (y/n)"
read choice
echo "your choice : $choice"

# 延时5秒,带注释读取,如果有效期内打印输入的值
if read -t 5 -p "Please enter your name: " name
then
    echo "Hello $name"
else
    echo "Sorry, timeout! "
fi

# 演示当前目录的文件目录选择提示创建或者删除
echo ..........................................
param=$1
echo $param
if [ -n "$param" ]
then
  if [ -e "$param" ]
   then
     echo "文件存在,输入y,则创建,输入n则删除"
     if [ "$(read name)" == "y" ]
     then
        echo "创建目录"`mkdir $param`
     else
        echo "删除目录"`rmdir $param`
     fi
   else
     mkdir $param
  fi
else
  echo "参数没有指定"
fi
~

 

 

你可能感兴趣的:(linux基础)