Shell 编程基础指南:从变量到函数的全方位解析


我们将深入探讨Shell编程的基本概念与用法,包括变量定义、流程控制、条件判断和自定义函数等。无论是刚入门的开发者还是希望巩固基础的用户,都能在这里找到实用的知识与示例。让我们一起来探索Shell编程的魅力!

定义

定义规则

1)变量名称可以由字⺟、数字和下划线组成,但是不能以数字开头, 环境变量名建议⼤写 \color{red}{环境变量名建议⼤写} 环境变量名建议

2) 等号两侧不能有空格 \color{red}{等号两侧不能有空格} 等号两侧不能有空格

定义变量

unset:删除变量名

username="小明"
echo $username

定义数组

arr=("大白" "大黑" "大灰")
echo $arr
echo ${arr[1]} //获取第一个元素
 echo ${arr[*]} //获取所有元素

将局部变量提升为全局

export:变量名

引导引号

[root@iZ4k2o11wt0h7eZ demo]# USER=大白
[root@iZ4k2o11wt0h7eZ demo]# echo $USER
大白
[root@iZ4k2o11wt0h7eZ demo]# USER='大白'
[root@iZ4k2o11wt0h7eZ demo]# kk='$USER,是白的'
[root@iZ4k2o11wt0h7eZ demo]# echo $kk
$USER,是白的
[root@iZ4k2o11wt0h7eZ demo]# kk="$USER,是白的"
[root@iZ4k2o11wt0h7eZ demo]# echo $kk
大白,是白的

对单引号内的字符串将始终被解释为它的本身 \color{red}对单引号内的字符串将始终被解释为它的本身 对单引号内的字符串将始终被解释为它的本身

反引号

yy=`ls`  //min

image-20240717143753306

特殊的变量名

$n:n为数字$1- 9 代表第⼀到第九个参数,⼗以上的参数需要⽤⼤括号包含,如 9代表第⼀到第九个参数,⼗以上的参数需要⽤⼤括号包含,如 9代表第到第九个参数,以上的参数需要⽤⼤括号包含,如{10})

$#:获取所有输⼊参数个数

$*:这个变量代表命令⾏中所有的参数,$*把所有的参数看成⼀个整体

$@:这个变量也代表命令⾏中所有的参数,不过$@把每个参数区分对待

$? : 查看上一次命令或者脚本执行状态的结果 如果是0
则表明输入指令正确,非0为错误

[root@iZ4k2o11wt0h7eZ ~]# cat kk.sh
echo $2  //参数中第二个数
echo $#  //参数数量
echo $*  //所有的参数
echo $@  //所有的参数 (单独分开)
[root@iZ4k2o11wt0h7eZ ~]# sh kk.sh 6 5 4 9 8 7
5
6
6 5 4 9 8 7
6 5 4 9 8 7

运算符

算数运算

expr + , - , *, /, % 加,减,乘,除,取余

[root@iZ4k2o11wt0h7eZ demo]# echo $[4+6]
10
[root@iZ4k2o11wt0h7eZ demo]# echo $((5+7))
12
[root@iZ4k2o11wt0h7eZ demo]# expr 3 + 2
5

正则表达式

正则表达式使⽤单个字符串来描述、 匹配⼀系列符合某个语法规则的字符串。 在很多⽂本编辑器⾥,正则表达式通常被⽤来检索、 替换那些符合某个模式的⽂本。 在 Linux 中, grep,sed, awk 等⽂本

处理⼯具都⽀持通过正则表达式进⾏模式匹配

[root@iZ4k2o11wt0h7eZ demo]# grep "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash

[root@iZ4k2o11wt0h7eZ demo]# grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
yk:x:1000:1000::/home/yk:/bin/bash

[root@iZ4k2o11wt0h7eZ demo]# grep "r..t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@iZ4k2o11wt0h7eZ demo]# echo '123$456$789' | grep '\$'
123$456$789

逻辑运算符

格式:[ 条件 ]

注意:[] ⾥⾯前后必须要有空格

结果:0 表示真 ⾮0表示假

(1)两个整数之间⽐较

= 字符串⽐较

-lt ⼩于(less than)

-le ⼩于等于(less equal)

-eq 等于(equal)

-gt ⼤于(greater than)

-ge ⼤于等于(greater equal)

-ne 不等于(Not equal)

(2)按照⽂件权限进⾏判断

-r 有读的权限(read)

-w 有写的权限(write)

-x 有执⾏的权限(execute)

(3) 按照文件类型进行判断

-f 文件存在并且是一个常规文件(file)

-e文件存在

-d ⽂件存在并是⼀个⽬录(directory)

(4)多条件判断(&& 表示前⼀条命令执⾏成功时,才执⾏后⼀条命令,|| 表示上⼀条命令执⾏失败后,才执⾏下⼀条命令)

特殊字符串

^:匹配以目标为开头的一行

[root@iZ4k2o11wt0h7eZ ~]# cat /etc/passwd | grep ^root
root:x:0:0:root:/root:/bin/bash

条件选择 if

注意事项: \color{red}注意事项: 注意事项:

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

(2)if后要有空格

//方法一:
age=$1
if [ $age -le 16 ]
then
        echo "他还是个孩子"
else
        echo "他已经是个大人了"
fi
//方法二:
if [ $1 -le 16 ]
then
        echo "他还是个孩子"
else
        echo "他已经是个大人了"
fi
//方法三:
if [ $1 -le 16 ];then
        echo "他还是个孩子"
else
        echo "他已经是个大人了"
fi

elif

age=$1
if [ $age -le 16 ]
        then
                echo "他还是个孩子"
elif [ $1 -le 24 ] && [ $1 -gt 18 ]
        then
                echo "是个年轻人了"
else
                echo "他已经是个大人了"
fi

条件判断case

case $1 in
"上午")
        echo "火锅"
        ;;
"中午")
        echo "炒面"
        ;;
"晚上")
        echo "喝点燕窝"
        echo "喝点小酒"
        ;;
*)
        echo "你重新看时间"
        ;;
esac

注意事项:

  1. case⾏尾必须为单词“in”,每⼀个模式匹配必须以右括号“)”结束。
  2. 双分号“;;”表示命令序列结束,相当于java中的break。
  3. 最后的“*)”表示默认模式,相当于java中的default。

循环

for

s=0
for((i=0; i<=100; i++));do
        s=$[$s+$i]
done
echo $s
# $@ 最终会被""解析为每一个数组元素都是出传入的参数
for j in "$@"
do
        echo $j
done

# $* 最终会被""解析为一个连续的字符串只有一个元素
for j in "$*"
do
        echo $j
done

while

num=$1
s=0
while [ $num -ge 0 ]
do
        s=$[$num+$s]
        num=$[$num-1]
done
echo $s

until循环

num=$1
s=0
until [ $1 -eq 0 ]
do
        s=$[$1+$s]
        num=$[$1-1]
done
echo $s

进⼊条件:循环条件为true ;退出条件:循环条件为false;刚好和while相反,所以不常⽤,⽤while就⾏。

select循环与菜单

PS3是 select 的提示符,⾃动⽣成菜单

PS3="请输入你的选择:"
select menu in 米饭 炒面 八宝粥 包子 退出
do
        case $REPLY in
        1|4)
                echo "$menu 价格为14"
                ;;
        2|3)
                echo "$menu 价格为18"
                ;;
        5)
                break
                ;;
        *)
                echo "重新选择"
        esac
done 

① select 循环主要⽤于创建菜单,按数字顺序排列的示菜单项将显示在标准错误上,并显示PS3 提示符,等待⽤户输⼊

② ⽤户输⼊菜单列表中的某个数字,执⾏相应的命令

③ ⽤户输⼊被保存在内置变量 REPLY 中

④ select 是个⽆限循环,因此要记住⽤ break 命令退出循环,或⽤ exit 按 命令终⽌脚本。也可以按ctrl+c退出循环

⑤ select 和 经常和 case 联合使⽤

⑥ 与for循环类似,可以省略 in list, 此时使⽤位置参量

read 读取控制台输出入

read -p "输入一个数:" num
echo $num

自定义函数

function is()
{
read -p "输入一个数:" num
   if [ $num -le 1 ];then
        echo "$num 不是质数"
        return
   fi
    for((i=2; i*i<=$num; i++));do
        if [ $(($num % i)) -eq 0 ];then
          echo "$num 不是质数"
          return
        fi
    done
echo "$num 是质数"
}
is

制台输出入

read -p "输入一个数:" num
echo $num

自定义函数

function is()
{
read -p "输入一个数:" num
   if [ $num -le 1 ];then
        echo "$num 不是质数"
        return
   fi
    for((i=2; i*i<=$num; i++));do
        if [ $(($num % i)) -eq 0 ];then
          echo "$num 不是质数"
          return
        fi
    done
echo "$num 是质数"
}
is

本指南涵盖了Shell编程的基本概念和常用结构。掌握这些基础内容后,你将能够编写更复杂的脚本,解决实际问题,并为进一步学习打下坚实的基础。希望你在Shell编程的旅程中不断探索与成长!

  • 13
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值