首页 > 系统相关 >linux_编写一个shell脚本

linux_编写一个shell脚本

时间:2022-11-09 07:56:47浏览次数:56  
标签:shell num 变量 echo newland sh linux 编写

linux|编写一个shell脚本

编写第一个shell

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

image-20221108103613901

Shell变量

系统变量

用户自定义变量

定义shell变量

变量不可用数字开头

等号两侧不可用空格

变量一般习惯为大写

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

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

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

将指令结果赋值给变量

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

image-20221108110143916

设置环境变量

环境变量

在文件中创建环境变量

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

在/etc/profile添加:

export MY_HOME=/home/newland #

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

$soure  /etc/profile

输出

image-20221108145329767

位置参数变量

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

基本语法

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

例:

#!/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

系统定义的变量

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

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

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

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

例:

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

image-20221108161347190

运算符

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

条件判断

判断语句

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

-lt 小于

-le 小于等于

-eq 等于

-gt 大于

-ge 大于等于

-ne 不等于

  • 按照文件权限进行判断

-r 有读的权限

-w 有写的权限

-x 有执行的权限

  • 按照文件类型进行判断

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

-e 文件存在

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

流程控制

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

case语句

语法

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

for循环

基本语法

#语法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
<===================================================>
* 
* * 
* * * 
* * * * 
* * * * * 

while循环

基本语法

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

具体差不多和for循环一样

函数

定义函数格式

[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

标签:shell,num,变量,echo,newland,sh,linux,编写
From: https://www.cnblogs.com/Xin-chen/p/16871943.html

相关文章

  • linux 进程管理
    Linux进程管理linux中每一个运行中的程序叫做进程,每个运行中的进程都会分配一个ID号大多系统进程运行在后台,常驻在系统中直到关机才会结束查看Linux的系统进程ps$ps......
  • valheim英灵神殿Linux使用docker开服
    valheim英灵神殿Linux使用docker开服使用机器:2核4G的Ubuntu,swap设置为8G(满足配置能装docker的Linux就行)在docker官网的镜像站有别人封装好的镜像,我们下载下来启动就可......
  • Linux多线程开发
    1.线程线程概述与进程(process)类似,线程(thread)是允许应用程序并发执行多个任务的一种机制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序,且共享......
  • shell-文本处理学习笔记
    grep和egrep第一种形式:grep[option][pattern][file1file2...]第二种形式:command|grep[option][patern]选项:option-v不显示匹配行grep-vpythonfile......
  • Linux高并发网络编程开发——广播-组播-本地套接字
    在学习Linux高并发网络编程开发总结了笔记,并分享出来。有问题请及时联系博主:​​Alliswell_WP​​,转载请注明出处。10-Linux系统编程-第14天(广播-组播-本地套接字)一、学习目......
  • linux 用户增加root权限
    1.切换到root用户下2.添加sudo文件的写权限,命令是:chmod u+w/etc/sudoers 3.编辑sudoers文件vi/etc/sudoers找到这行rootALL=(ALL)ALL,在他下面添加xxxALL......
  • shell脚本,创建新用户并判断该用户是否存在
    如果输入的用户账户名已经存在。则输出提示“输入的用户账户名已经存在”,并结束程序,反之,则要求输入用户密码,并创建该用户。#!/bin/bashecho"正在创建一个用户账户……"......
  • Linux高并发网络编程开发——epoll-udp
    在学习Linux高并发网络编程开发总结了笔记,并分享出来。10-Linux系统编程-第13天(epoll-udp)目录:一、学习目标二、复习1、通过gdb定位段错误的位置2、TCP状态转换复习三、epoll......
  • Linux高并发web服务器开发——web服务器 - 1
    在学习Linux高并发web服务器开发总结了笔记,并分享出来。11_服务器开发-第01天(web服务器-1)  一、复习       二、html1、html介绍》HTML简介:​​https://www.w3s......
  • Linux高并发网络编程开发——网络编程基础-socket
    在学习Linux高并发网络编程开发总结了笔记,并分享出来。10-Linux系统编程-第10天(网络编程基础-socket)目录:一、Linux网络编程阶段二、网络基础1、网络开发两种设计模式2、协......