Linux学习笔记:Shell脚本

Shell程序设计

    • Shell脚本运算符
    • Shell脚本中的变量
    • Shell脚本if语句
    • Shell脚本case语句
    • Shell脚本for语句
    • Shell脚本while语句

Shell脚本运算符

计算4×5÷6
方法一:
使用$(())

A=$(((4*5)/6))
echo A=$A

方法二:
使用$[]

B=$[(4*5)/6]
echo B=$B

方法三:
使用expr
中间需要使用空格隔开
赋值要使用反引号·

C=`expr 4 \* 5 / 6 `
echo C=$C 

运行结果:

bash mathrl
A=3
B=3
C=3

Shell脚本中的变量

创建,输出,删除变量

#!/bin/bash 
#声明

#创建一个变量
#中间不能使用空格
A=100

#输出变量,使用$
echo $A
echo A=$A
echo "A=$A"
#删除变量
unset A
echo A

运行结果

100
A=100
A=100
 

静态变量

#创建静态变量 
readonly B=2
#输出
echo $B
#删除变量
unset B

运行结果

2
bash: unset: B:无法取消设定: 只读 variable

静态变量不可被删除

系统变量
在系统中已经设置好的变量

echo $HOME
echo $USER
echo $HOME
#还有很多

可以使用set查看系统变量

环境变量
在各个shell脚本中都能使用的变量(全局变量)

var1.sh
#定义一个环境变量
export EX_VAR=10

在另外一个脚本中使用

#加载变量
source var1.sh
#输出变量
echo $EX_VAR

运行

10

将命令赋值给变量

A=$(ls)
echo $A

运行结果

var1.sh var2.sh var.sh

位置参数变量
$*:输出所有参数(整体输出)
$@:输出所有参数(分别单独输出)
$#:输出参数个数

#!/bin/bash

#输出参数
echo 0=$0 1=$1 2=$2 3=$3
#输出所有参数 方法一
echo 所有参数为$*
#输出所有参数 方法二
echo 所有参数为$@
#输出参数个数
echo $#

运行

#传入参数运行,参数之间用空格分开
bash var2.sh 10 20 30
#结果
0=var2.sh 1=10 2=20 3=30
所有参数为10 20 30
所有参数为10 20 30
3

预定义变量
$$:当前进程PID
$!:输出当前最后一个后台的进程号
$?:输出最后一个执行命令的状态,为0正常

#!/bin/bash

#输出当前进程的PID
echo 当前进程的PID为$$

#后台运行程序
gedit var.sh &
#输出当前最后一个后台的进程号
echo 最后一个后台进程号$!

#输出最后一个执行命令的状态,为0正常
echo 状态为$?

运行结果

当前进程的PID为2119
最后一个后台进程号2705
状态为0

Shell脚本if语句

if [ 条件 ] #中括号里面一定要空格
then 命令
fi
if [ 条件 ] #中括号里面一定要空格
then 命令
elif [ 条件 ]
then 命令
...
else 命令
fi

[]测试条件参数:
整数判断

参数 功能
-eq 等于
-ne 不等于
-lt 小于
–le 小于等于
-gt 大于
-ge 大于等于

字符串判断

参数 功能
= 等于
!= 不等于
str1 < str2 小于
str1 >str2 大于
str 非空为真
-n str 长度大于0为真
-z str 长度等于0为真

大于小于是以字典顺序排序

文件判断

参数 功能
-r 可读
-w 可写
-x 可执行
-f 文件存在且存在
-d 文件为目录

逻辑运算

参数 功能
!
-a
-o

案例1:判断学生成绩,<60不及格,>60和<80及格,>80优秀,其他成绩错误。

#!/bin/bash

if [ $1 -lt 60 -a $1 -ge 0 ]
then
        echo "不及格"
elif [ $1 -lt 80 ]
then
        echo "及格"
elif [ $1 -le 100 ]
then 
        echo "优秀"
else 
        echo "成绩错误"
fi

运行结果

bash if1 0
不及格
bash if1 100
优秀
bash if1 120
成绩错误

案例2:判断文件权限,可写,可读,可执行,不存在输出文件不存在:

#!/bin/bash

if [ -f $1 ]
then
        echo -n "$1文件"
        if [  -r $1 ]
        then
        echo -n "可读"
        fi
        if [ -w $1 ]
        then
        echo -n "可写"
        fi
        if [ -x $1 ]
        then
        echo -n "可执行"
        fi
else    
        echo "文件不存在"
fi
echo

运行结果

bash if2 txt #运行
文件不存在  #结果
touch txt #运行
bash if2 txt #运行
txt文件可读可写  #结果

Shell脚本case语句

case语句的格式:

case 字符串 in
模式字符串1) 命令 ;;
模式字符串2) 命令 ;;
模式字符串3) 命令 ;;
模式字符串4) 命令 ;;
*)命令 ;;
esac

如果字符串等于模式字符串1-4就执行,如果都不满足,就执行)的命令。*

案例:写一个shell来控制文件,输入1输出文件内容,输入2删除文件,输入3改变文件名称,其他输出错误。
程序如下:

#!/bin/bash

case $1 in
1) cat $2 ;;
2) rm $2 ;;
3) mv $2 $3 ;;
*) echo "指令错误"
esac

运行如下

qx@qx-VirtualBox:~/桌面/Class/ifelse$ bash case 3 txt atxt
qx@qx-VirtualBox:~/桌面/Class/ifelse$ ls
atxt  case  if1  if2
qx@qx-VirtualBox:~/桌面/Class/ifelse$ bash case 1 atxt
abcdefg

qx@qx-VirtualBox:~/桌面/Class/ifelse$ bash case 2 atxt
qx@qx-VirtualBox:~/桌面/Class/ifelse$ ls
case  if1  if2
qx@qx-VirtualBox:~/桌面/Class/ifelse$ bash case 4 atxt
指令错误

Shell脚本for语句

格式一:

for 变量 in "值表"
do 
	命令
done

格式二:

for (( e1;e2;e3 ))
do
	命令
done

和C语言类似,比如for (( i=0; i<100; i++ ))

案例:将输入的所有数进行求和
使用方法一写:

#!/bin/bash

sum=0
for i in " $@ "
do
  sum=$[$sum+$i]
done
echo $sum

运行结果:

bash -x for 1 2 3 4 5
+ sum=0
+ for i in " $@ "
+ sum=1
+ for i in " $@ "
+ sum=3
+ for i in " $@ "
+ sum=6
+ for i in " $@ "
+ sum=10
+ for i in " $@ "
+ sum=15
+ echo 15
15

使用方法二写:

#!/bin/bash

num=$#
sum=0
for(( i=1; i<=num; i++ ))
do
  sum=$[$sum+$i]
done
echo $sum

运行结果:

bash -x for2 1 2 3 4 5
+ num=5
+ sum=0
+ (( i=1 ))
+ (( i<=num ))
+ sum=1
+ (( i++  ))
+ (( i<=num ))
+ sum=3
+ (( i++  ))
+ (( i<=num ))
+ sum=6
+ (( i++  ))
+ (( i<=num ))
+ sum=10
+ (( i++  ))
+ (( i<=num ))
+ sum=15
+ (( i++  ))
+ (( i<=num ))
+ echo 15
15

Shell脚本while语句

格式:

while [ 条件 ]
do
	指令
done

注意:while与中括号需要有空格

案例:将输入的数据进行求和
程序如下:

#!/bin/bash

sum=0
num=0

while [ $# -ne 0 -a $num -lt $# ]
do
  num=$[$num+1]
  sum=$[$sum+$num]
done
echo sum=$sum

运行如下:

bash -x while 1 2 3 4 5
+ sum=0
+ num=0
+ '[' 5 -ne 0 -a 0 -lt 5 ']'
+ num=1
+ sum=1
+ '[' 5 -ne 0 -a 1 -lt 5 ']'
+ num=2
+ sum=3
+ '[' 5 -ne 0 -a 2 -lt 5 ']'
+ num=3
+ sum=6
+ '[' 5 -ne 0 -a 3 -lt 5 ']'
+ num=4
+ sum=10
+ '[' 5 -ne 0 -a 4 -lt 5 ']'
+ num=5
+ sum=15
+ '[' 5 -ne 0 -a 5 -lt 5 ']'
+ echo sum=15
sum=15

你可能感兴趣的:(学习,linux)