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

原文地址:http://www.cnblogs.com/Xin-chen/p/16871943.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性