Linux Bash Shell 快速上手 - 上篇

这篇是Bashe Shell快速上手的上半篇,下篇可以参考

Linux Bash 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.shsh 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员不鸣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值