linux_编写一个shell脚本

1|0linux|编写一个shell脚本

1|1编写第一个shell

$vim hello.sh
#!/bin/bash echo"hello world"
$chmod 777 hello.sh
$./hello.sh

image-20221108103613901

1|2Shell变量

系统变量

用户自定义变量

1|0定义shell变量

变量不可用数字开头

等号两侧不可用空格

变量一般习惯为大写

  • i=114514 echo "$i"
  • image-20221108104932925

1|0静态变量 - redonly 只读不可赋值

  • i=114514 echo "$i" unset i readonly i=10086 echo "$i" unset i
  • image-20221108105404300

1|0将指令结果赋值给变量

S=`date` echo "S=$S" S=$(date) echo "S=$S"

image-20221108110143916

1|0设置环境变量

环境变量

在文件中创建环境变量

自定义环境变量可以在命令行中设置和创建,但用户退出命令时这些变量值就会丢失。如果希望永久保存环境变量,可在用户家目录下的.bash_profile 或 .bashrc文件中,或者全局配置/etc/bashrc或 /etc/profile 文件中定义

在/etc/profile添加:

export MY_HOME=/home/newland #

要使配置的全局变量立即生效

$soure /etc/profile

输出

image-20221108145329767

1|0位置参数变量

  • 执行shell脚本的时候如果想要获取到命令行的参数信息
    • 如:./xxx.sh a b
    • a和b是传入命令行的值

1|0基本语法

  • $n |n为数字,$0代表命令本身 $1-$9代表第一到第九个参数,十以上的参数需要用{}包含$
  • $* | 这个变量代表命令行中的所有参数,$*把所有的参数看做一个整体
  • $@ | 这个变量也代表命令行中的所有参数 ,不过$@把每个参数 区分对待
  • $# | 这个变量代表命令行中的所有参数的个数

例:

#!/bin/bash echo "0=$0 1=$1 3=$2" echo "all = $*" echo "$@" echo "count = $#" echo "$1$2"

输出

newland@newland-VirtualBox:~/shell_learn$ ./position.sh 1 2 0=./position.sh 1=1 3=2 all = 1 2 1 2 count = 2 12

1|0系统定义的变量

  • $$ | 当前进程的进程号(PID)

  • $! | 后台运行的最后一个进程号(PID)

  • $? | 最后一次执行命令的返回状态

    • 值为0 正确执行成功 否则执行不正确

例:

#!/bin/bash echo "id=$$" ./bianliang.sh 12 13 |grep xxx & echo "- id=$!" echo "$?"

image-20221108161347190

1|3运算符

shell中的运算符

  • $((运算式))或者$[运算式] 或者 expr m+n //expression表达式
  • expr 运算符后面要有空格,如果将expr的结果赋值给某个变量,使用``
  • expr 运算符前后面要加空格
  • expr \*,/,% 乘除取余

例:

ABC=`expr 2 + 1` echo "$ABC" echo "$(($1+$2))" echo "$[100+200]" echo `expr 20 \* 10`

输出

newland@newland-VirtualBox:~/shell_learn$ ./YSF.sh 12 12 3 24 300 200

1|4条件判断

判断语句

  • = 字符串比较
  • 两个整数的比较

-lt 小于

-le 小于等于

-eq 等于

-gt 大于

-ge 大于等于

-ne 不等于

  • 按照文件权限进行判断

-r 有读的权限

-w 有写的权限

-x 有执行的权限

  • 按照文件类型进行判断

-f 文件存在并且是一个常规的文件

-e 文件存在

-d 文件存在并且是个目录

1|5流程控制

if[条件判断式]

then

代码

fi

或者

if[条件判断式]

then

代码

elif[条件判断式]

then

代码

fi

中括号和条件判断中间有空格

例1:

Chengji=$1 if [ $Chengji -gt 60 ] then echo "dayu 60" elif [ $Chengji -lt 60 ] then echo "xiaoyu 60" fi

输出

newland@newland-VirtualBox:~/shell_learn$ ./chengji.sh 61 dayu 60 newland@newland-VirtualBox:~/shell_learn$ ./chengji.sh 56 xiaoyu 60

例2:

if [ -f YSF.sh ] then sudo rm -rf /home/newland/YSF.sh echo "OK" fi

输出

image-20221108175251899

1|0case语句

语法

case $变量名 in “值1") 符合值1执行程序 ;; ”值2“) 符合值2执行程序 ;; ...xxx... *) 不符合以上条件的程序 ;; esac #结束

例:

case $1 in "1") echo "First" ;; "2") echo "Second" ;; "3") echo "Third" ;; "4") echo "Fouth" ;; *) echo "$1 th" ;; esac

输出

image-20221108185101511

1|0for循环

1|0基本语法

#语法1 for 变量 in 值1 值2 值3 do #程序、代码 down #语法2 for((初始值;循环控制条件;变量变化)) do #程序/代码 done

for i in "$*" do echo "num is $i" done echo "<===================================================>" unset i for i in "$@" do echo "num is $i" done #$* & $@的区别 echo "<===================================================>" unset i for((i=1;i<=$1;i++)) do for((j=0;j<i;j++)) do printf "* " done printf "\n" done

输出

newland@newland-VirtualBox:~/shell_learn$ ./forshell.sh 5 2 3 4 5 num is 5 2 3 4 5 <===================================================> num is 5 num is 2 num is 3 num is 4 num is 5 <===================================================> * * * * * * * * * * * * * * *

1|0while循环

基本语法

while [条件判断式] do #程序/代码 done

具体差不多和for循环一样

1|6函数

定义函数格式

[function]funname[()] { Action; [return int;] } #调用函数名 #调用直接写函数名

function getSum(){ for((i=0;i<10;i++)) do echo $i done } getSum

输出

newland@newland-VirtualBox:~$ ./func.sh 0 1 2 3 4 5 6 7 8 9

__EOF__

本文作者~内个臣呐~
本文链接https://www.cnblogs.com/Xin-chen/p/16871943.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ~内个臣呐~  阅读(402)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示