这篇是Bashe Shell快速上手的上半篇,下篇可以参考
一.什么是Shell
Shell的中文意识为“壳”,这层壳套在kernel(内核)之外,是用户与Linux 操作系统之间交互的一个命令解释器,是用户与Linux操作系统之间的桥梁。
Linux Shell 种类非常多, 常见的有: Bourne Shell ( /usr/bin/sh
或/bin/sh )、 Bourne Again Shell ( /bin/bash )、 C Shell
( /usr/bin/csh )、 K Shell ( /usr/bin/ksh )、 Shell for Root
( /sbin/sh )等。 不同的 Shell 语言的语法有所不同,所以不能交换
使用。
最常用的 shell 是 Bash,也就是 Bourne Again Shell ,由于易用和
免费, Bash在日常工作中被广泛使用,也是大多数 Linux 系统默认
的 Shell 。
bash shell一般以sh作为脚本后缀,并且以#!/bin/bash
作为脚本头,表示这是一个bash shell脚本。
在ubuntu系统中默认支持的是dash shell,所以需要更改为bash shell。
首先检测当前Linux使用的shell是否为bash:
ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Aug 12 14:29 /bin/sh -> dash
发现默认使用的是dash shell,所以要更改为bash shell:
sudo dpkg-reconfigure dash
选择no即可:
ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Apr 14 14:40 /bin/sh -> bash
- hello.sh
#!/bin/bash
# this is arong's first shell
echo hello shell
使用./hello.sh
或sh hello.sh
执行脚本,输出:hello shell
二.变量定义
Bash Shell的变量定义十分简单,例如要定义一个数字A=1,只需要直接为A赋值即可,而不需要声明并定义类型。使用$A即可取到A的值。
- type.sh
A=1
echo $A
SHELL常见的系统变量解析 :
- $0 当前程序的名称
- $n 当前程序的第 n 个参数 ,n=1,2…
- $* 当前程序的所有参数 ( 不包括程序本身 )
- $# 当前程序的参数个数 ( 不包括程序本身 )
- $? 命令或程序执行完后的状态,一般返回 0 表示执行成功。
- $UID 当前用户的 ID
- $PWD当前所在的目录
- 获取程序名并打印收集到的3个参数
#!/bin/bash
echo 程序名:$0
echo 第一个参数:$1
echo 第二个参数:$2
echo 第三个参数:$3
输出:
root@iZbp12kno11kc9e34bktfaZ:~/shell_learn# sh type2.sh first second three
程序名:type2.sh
第一个参数:first
第二个参数:second
第三个参数:three
三.if语句
- if.sh
#!/bin/bash
grade=$1
echo 输入成绩:$grade
if [ $grade -gt 100 -o $grade -le -1 ]
then
echo 成绩不合法
elif [ $grade -ge 90 ]
then
echo 成绩优秀
elif [ $grade -ge 80 ]
then
echo 成绩良好
elif [ $grade -ge 60 ]
then
echo 成绩中等
else
echo 成绩不合格
fi
输出:
root@iZbp12kno11kc9e34bktfaZ:~/shell_learn# sh if.sh -101
输入成绩:-101
成绩不合法
root@iZbp12kno11kc9e34bktfaZ:~/shell_learn# sh if.sh 90
输入成绩:90
成绩优秀
root@iZbp12kno11kc9e34bktfaZ:~/shell_learn# sh if.sh 60
输入成绩:60
成绩中等
root@iZbp12kno11kc9e34bktfaZ:~/shell_learn# sh if.sh 50
输入成绩:50
成绩不合格
注意:if条件中需要[空格+条件+空格]之间的条件两边需要加上空格,不然会报错。
常用的逻辑判断关键词:
- -f 判断文件是否存在 eg: if [ -f filename ]
- -d 判断目录是否存在 eg: if [ -d dir ]
- -eq 等于 应用于:整型比较
- -ne 不等于 应用于:整型比较
- -lt 小于 应用于:整型比较
- -gt 大于 应用于:整型比较
- -le 小于或等于 应用于:整型比较
- -ge 大于或等于 应用于:整型比较
- -a 双方都成立(and) 逻辑表达式 –a 逻辑表达式
- -o 单方成立(or) 逻辑表达式 –o 逻辑表达式
- -z 空字符串
判断输入的文件夹是否存在,不存在则创建:
- if2.sh
#!/bin/bash
# 判断文件是否存在,不存在则新建(必须由root用户创建 pid=0)
DIR=$1
if [ ! -d $DIR ]
then
echo $DIR不存在
if [ `id -u` -eq 0 ]
then
echo 是ROOT用户,可创建文件
mkdir -p $DIR
else
echo 非ROOT用户,不可创建文件
fi
else
echo $PID存在,退出程序
exit 0
fi
四.循环操作
- for.sh
#!/bin/bash
# 打印1-10的数字
for number in `seq 10`
do
echo 打印数字:$number
done
输出:
打印数字:1
打印数字:2
打印数字:3
打印数字:4
打印数字:5
打印数字:6
打印数字:7
打印数字:8
打印数字:9
打印数字:10
从1累加到n
- for2.sh
#!/bin/bash
read -p "输入从1累加到N中的N:" n
sum=0
for((i=1;i<=$n;i++))
do
sum=`expr $sum + $i`
done
echo $sum
输出:
root@iZbp12kno11kc9e34bktfaZ:~/shell_learn# sh for2.sh
输入从1累加到N中的N:100
5050
- while.sh
#!/bin/bash
# 使用while循环累计啊1-100
sum=0
i=0
while ((i<=100))
do
sum=`expr $sum + $i`
((i++))
done
echo 累积和:$sum
- case.sh
#!/bin/bash
# 使用case语句来完成相应操作
echo '输入1、2、3将其打印'
read num
case $num in
1) echo '打印:1'
;;
2) echo '打印:2'
;;
3) echo '打印:3'
;;
*) echo '输入不合法'
;;
esac
输出:
root@iZbp12kno11kc9e34bktfaZ:~/shell_learn# sh case.sh
输入1、2、3将其打印
3
打印:3
root@iZbp12kno11kc9e34bktfaZ:~/shell_learn# sh case.sh
输入1、2、3将其打印
10
输入不合法
- caseAndBreak.sh
#!/bin/bash
# 制造死循环,当输入为0时终止程序
while true
do
read -p '输入数字为0则终止程序:' num
case $num in
0) echo '程序终止'
break
;;
*) echo '程序继续执行'
;;
esac
done
- select.sh
#!/bin/bash
# 在1、2、3之间进行选择
echo '请在1、2、3之间进行选择'
select num in 1 2 3
do
if [[ $num != 1 && $num != 2 && $num != 3 ]]
then
echo '程序结束'
break
fi
echo '你的选择为:'$num
done
输出:
root@iZbp12kno11kc9e34bktfaZ:~/shell_learn# sh select.sh
请在1、2、3之间进行选择
1) 1
2) 2
3) 3
#? 1
你的选择为:1
#? 2
你的选择为:2
#? 3
你的选择为:3
#? 4
程序结束
五.数组
在Bash Shell中只允许定义一维数组,并且在定义时不需要声明其大小,可以采用 a r r a y [ i n d e x ] 的方式来取出特定索引的值,也可以通过 {array[index]}的方式来取出特定索引的值,也可以通过 array[index]的方式来取出特定索引的值,也可以通过{array[]}的方式将其所有元素打印出来,用${#array[]}获取数组长度:
- array.sh
#!/bin/bash
# 创建数组并遍历
# 第一种方式:array=(A B C D E)
# 第二种方式:
array[0]=A
array[1]=B
array[2]=C
array[3]=D
array[4]=E
echo '数组元素个数:'${#array[*]}
echo '数组元素打印:'${array[*]}
echo '第3个元素:'${array[2]}
输出:
root@iZbp12kno11kc9e34bktfaZ:~/shell_learn# sh array.sh
数组元素个数:5
数组元素打印:A B C D E
第3个元素:C
也可以结合for循环来遍历数组:
- array2.sh
#!/bin/bash
array=(1 2 3 4)
for i in ${array[*]}
do
echo $i
done
输出:
root@iZbp12kno11kc9e34bktfaZ:~/shell_learn# sh array2.sh
1
2
3
4