fablefe 发表于 2018-8-28 09:26:15

Shell编程之算数、条件测试read详解二(待续...)

  一、shell脚本编程
  Shell和shell脚本的区别
  shell就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它为用户提供了一个向Linux发送请求以便运行程序的接口系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。Shell本身是一个用C语言编写的程序,他是用户使用Linux的桥梁。
  shell即是一种命令语言,优势一种程序设计语言(就是我们所说的shell脚本)。作为命令语言,它互动德解释和执行用户输入的命令;作为程序命令语言它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。
  
  (1)bash中的算术运算
  操作符:+, -, *, /, %(取余),
  +=, -=,*=, /=, %=
  declare
  -i:整型变量
  -x:环境变量,类似于export
  let varName='算数表达式'
  varName=$[算术表达式]
  varName=$((算术表达式))
  varName=`expr $num1 + $num2`
  示例:
  (1)
# num1=5  
# num2=6
  
# let sum="$num1*$num2"
  
# echo $sum
  
30
  

  
# sum=$
  
# echo $sum
  
1
  

  
# sum=`expr $num1 + $num2`
  
# echo $sum
  
11
  

  
# num1=11
  
# num2=5
  
# sum=$((num1/num2))
  
# echo $sum
  
2
  
注意:如果计算结果中存在小数,将会被圆整;
  

  
# num1=11
  
# num2=2
  
# sum=$
  
# echo $sum
  
1
  

  
#a=40
  
#a=$
  
#echo $a
  
42
  
自加并赋值给自身
  

  
# a=$
  
# echo $a
  
40
  
自减并赋值给自身
  

  
#a=40
  
# a=$
  
# echo $a
  
80
  
乘等并赋值给自身
  
.....
  

  
(2)计算100以内所有整数之和;
  
#!/bin/bash
  
#
  
declare -i sum=0
  
for i in {1..100}; do
  
    let sum=$[$sum+$i]
  
done
  
echo "The sum is: $sum."
  

  
(3)分别计算100以内所有偶数之和和奇数之和;
  
#!/bin/bash
  
#
  
declare -i oddSum=0, evenSum=0
  
for i in `seq 1 2 100`; do
  
    oddSum=$[$oddSum+$i]
  
done
  

  
for j in `seq 2 2 100`; do
  
    evenSum=$[$evenSum+$j]
  
done
  
echo "The even Sum is: $evenSum, the odd sum is: $oddSum"
  
  
  
  (2)变量的类型:
  本地变量:只对当前shell进程有效,对其子shell及其他shell都无效;
  定义变量:Var_Name="Value"
  引用变量:${Var_Name}
  撤销变量:unset Var_Name
  局部变量:仅对局部代码生效;
  local Var_Name="Value"
  环境变量:对当前shell进程及其子进程有效;
  export Var_Name="Value"
  位置参数变量:
  $0:脚本自身
(4)#!/bin/bash  
#
  
echo "The sum is: $[$1+$2]"
  
echo $0
  
# ./opt.sh 10 11
  
The sum is: 21
  
./opt.sh
  $1:脚本的第一个参数
  $2:脚本的第二个参数
  ....
  (5)
#!/bin/bash  
#
  
echo "The sum is: $[$1+$2]"
  

  
#chmod +x opt.sh
  
#./opt.sh 10 11
  
The sum is: 21
  特殊变量:
  $#:位置参数的个数;
# ./opt.sh 10 11 9 8  
The sum is: 21
  
4
  $*,$@:引用所有的位置参数
  (6)
#!/bin/bash  
#
  
echo "The sum is: $[$1+$2]"
  
echo $*
  
echo $@
  
# ./opt.sh 10 11 9 8
  
The sum is: 21
  
10 11 9 8
  
10 11 9 8
  $?:上一条命令的执行状态
  状态用数字表示:
  0:表示成功
  1-255:失败
  给变量以默认值
  varName=${varName:-value}
  如果varName不空,则其值不变;否则,VarName会使用value做为其值;

  read:用户交互脚本;
  -p:提示符
  -t :超时时间
  (7)
#!/bin/bash  
#
  
read -t 5 -p "Enter a number: " num
  

  
num=${num:-0}
  
echo $num
  
# ./num1.sh
  
Enter a number: 0   #上面-t指定的超时时间为5秒钟,如果执行脚本之后等5秒钟(或直接回车),就会把设定的默认值显示出来;
  

  
(8)通过键盘给定一个文件的路径,来判断文件内容的类型:
  
vim judge.sh
  
#!/bin/bash
  
#
  
read -p "Enter a file path: " fileName
  
file $fileName
  

  
bash judge.sh
  
Enter a file path: /etc/issue
  
/etc/issue: ASCII text
  二、Bash编程之条件判断:
  条件判断的常用测试类型:
  整数测试
  字符测试
  文件测试
  命令状态返回值:
  $?
  0:真
  1-255:假
  逻辑运算:
  与运算:
  真 && 真 = 真
  真 && 假 = 假
  假 && 真 = 假
  假 && 假 = 假
  或运算:
  真 || 真 = 真
  真 || 假 = 真
  假 || 真 = 真
  假 || 假 = 假
  非运算:
  !真 = 假
  !假 = 真
  Bash中条件判断中if的使用;
  单分支:
  if 条件;then
  分支1
  fi
  双分支:
  if 条件;then
  分支1
  else
  分支2
  fi
  多分支:
  if 条件1;then
  分支1;
  elif 条件2;then
  分支2;then
  elif 条件3;then
  分支3;
  .....
  else
  分支n;
  fi
  示例:
  (9)让用户指定一个文件,判定;如果文件有空白行,就显示空白行数,否则,就说明文件无空白行;
#!/bin/bash  
#
  
read–p “Enter a file path: ” filename
  
if grep “^$”$fileName &> /dev/null; then
  
    linesCount=`grep “^$” $fileName | wc -l`
  
    echo “$fileName has $linesCount space lines.”
  
else
  
    echo “$fileName hava no space line.”
  
fi
  (10)
  显示如下菜单:
  cpu)show cpu info;
  mem)show memory info;
  quit)quit
  Enter your options: CPU Cpu Cpu
  如果用户选择cpu,则显示文件/proc/cpuinfo的信息;
  无果用户选择mem,则显示文件/proc/meminfo的信息;
  如果用户选择quit,则退出,并且退出吗为5;
  如果用户键入其他字符,则显示位置选项,请重新执行脚本;退出码为6;
vim showinfo.sh  
#!/bin/bash
  
#
  
returnValue=0
  

  
cat/dev/null; then
  
    userID=`id –u $userName`
  
    echo “$userName: $userID”
  
else
  
    echo “$userName not exist.”
  
fi
  (15)让用户通过键盘输入一个用户名,如果用户不存在就退出;如果其UID等于其GID,就说他是“good guy” 否则,就说他是个“bad guy”;
#!/bin/bash  
#
  
read -t 10 -p "Enter a username: " userName
  
if ! id $userName &> /dev/null; then
  
    echo "$userName not exist."
  
    exit 6
  
fi
  

  
if [ `id -u $userName` -eq `id -g $userName` ]; then
  
    echo "Good guy"
  
else
  
    echo "Bad guy"
  
fi
  (16)添加10个用户stu1-stu10;但要先判断用户是否存在;
  如果存在,就用红色显示其已经存在;
  否则,就添加此用户,并绿色显示;
  最后显示一共添加了几个用户;
vim user.sh  
#!/bin/bash
  
#
  
declare -i userCount=0
  
for i in {1..10}; do
  
    if id stu$i &> /dev/null; then
  
      echo -e "\033[31mstu$i\033[0m exists."
  
    else
  
      useradd stu$i && echo -e "add \033[32mstu$i\033[0m finished."
  
      let userCount++
  
    fi
  
done
  
echo "Add $userCount users."
  

  
# bash user.sh
  
add stu1 finished.
  
add stu2 finished.
  
add stu3 finished.
  
add stu4 finished.
  
add stu5 finished.
  
add stu6 finished.
  
add stu7 finished.
  
add stu8 finished.
  
add stu9 finished.
  
add stu10 finished.
  
Add 10 users.
  2、字符测试
  双目:
  >:大于
   /dev/null || exit 5
  

  
downloader=`which wget`
  

  
[ -x $downloader ] || exit 6
  

  
$downloader $url
  

  
#bash download.sh

  (18)
  分别复制/var/log下的文件至/tmp/logs/目录中;
  复制目录时,才使用cp -r
  复制文件时,才使用cp
  复制链接文件,使用cp -d
  如果是其他文件,使用cp -a
vim cplog.sh  

  
#!/bin/bash
  
#
  
targetDir='/tmp/logs'
  

  
[ -e $targetDir ] || mkdir $targetDir
  

  
for fileName in /var/log/*; do
  
    if [ -d $fileName ]; then
  
      copyCommand='cp -r'
  
    elif [ -f $fileName ]; then
  
      copyCommand='cp'
  
    elif [ -h $fileName ]; then
  
      copyCommand='cp -d'
  
    else
  
      copyCommand='cp -a'
  
    fi
  

  
    $copyCommand $fileName $targetDir
  
done


页: [1]
查看完整版本: Shell编程之算数、条件测试read详解二(待续...)