linux下的shell脚本

本文深入探讨了Linux下的Shell脚本编写,涵盖了bash、sh等常见脚本解释器的使用,详细解析了变量定义、赋值规则、运算符、条件判断、循环结构及函数自定义等核心概念。

Linux下的shell脚本


Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本,常见的脚本解释器有:

bash:是Linux标准默认的shell。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的缩写,内部命令一共有40个。

sh: 由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell。
另外还有:ash、 csh、 ksh等。

关于注释的问题: 在shell中使用#进行注释,注意,sh里面没有多行注释,只能每一行加一个#号

  • shell脚本格式以 #!/bin/bash 开头
    #!/bin/bash/ 末尾多一个/ 会报错-bash: ./zk_start.sh: /bin/bash/: bad interpreter: Not a directory
#!/bin/bash
echo "helloworld"
  • shell执行方式
首先赋予执行权限
chmod 777 helloworld.sh

./helloworld.sh
/opt/helloworld.sh
sh ./helloworld.sh
bash ./helloworld.sh
bash opt/helloworld.sh
sh ./helloworld.sh
sh /opt/helloworld.sh
  • shell变量
    变量分为“系统变量”和“用户自定义变量”,可以通过set命令查看系统变量
    系统变量:$HOME、$PWD,$SHELL、$USER等等
[root@master opt]# echo $HOME
/root
[root@master opt]# echo $PWD
/opt
[root@master opt]# echo $USER
root
[root@master opt]# echo $SHELL
/bin/bash

显示当前shell中的所有变量:set

[lisi@localhost ~]$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=141
....

定义变量:变量=值(=等号左右没有空格)

[lisi@localhost ~]$ A=1  
[lisi@localhost ~]$ echo $A
1

撤销变量: unset 变量

[lisi@localhost ~]$ unset A
[lisi@localhost ~]$ echo $A

声明静态变量: readonly 变量=值

[lisi@localhost ~]$ readonly A=1
[lisi@localhost ~]$ A=2
-bash: A: readonly variable
[lisi@localhost ~]$ echo $A
1
[lisi@localhost ~]$ unset A
-bash: unset: A: cannot unset: readonly variable
定义变量规则:
变量名称可以由字母、数字和下划线组成,但不能以数字开头
等号两侧不能有空格
变量名称一般习惯为大写

将命令的返回值赋给变量:

A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
A=$(ls -la)等价于反引号
echo $A

位置参数变量

$n (n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十个参数需要大括号,如${10})
$* (这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (这个变量代表命令行中所有的参数,$@把每个参数区分对待)
$# (这个变量代表命令行中所有参数的个数)
#!/bin/bash

echo "$1"
echo "$2"
echo "$*"
echo "$@"
echo "$#"
[root@master opt]# ./p.sh  10 20
10
20
10 20
10 20
2

预定义变量

$$ (当前进程的进程号:PID)
S! (后台运行的最后一个进程的PID)
$? (最后一次执行的命令的返回状态。
如果这个变量的值为0证明上一个命令正确执行,
如果非0,则上一个命令执行不正确)
#!/bin/bash
echo "$$"
./helloworld.sh & 后台进程
echo "S!" #打印后台进程
echo "$?"

[root@master opt]# ./d.sh 
1817
1818
0

运算符

$((运算符))
[root@master ~]# A=$((2+3))  
[root@master ~]# echo $A
5

$[运算符]
[root@master ~]# A=$[2+8]                   
[root@master ~]# echo $A
10

expr m + n 运算符之间有空格
[root@master ~]# expr 2 + 5  
7
expr m - n 运算符之间有空格
[root@master ~]# expr 2 - 5                   
-3
(2+3)*4示例
A=$[(2+3)*4]
[root@master ~]# A=$[(2+1)*5] #注意没空格
[root@master ~]# echo $A
15

[root@master ~]# expr `expr 2 + 5` \* 5  #注意有空格
35

推荐使用 $[运算符]

判断

1.[ condition ] 注意condition前后要有空格
案例
[ hello ] 返回true
[] 返回false

[condition]&&echo OK || echo notok 条件满足,执行后面的语句

两个整数之间比较
=字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于

按照文件权限判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限

按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在并且是一个常规的文件
-d 文件存在并是一个目录

例子
[ 23 -ge 22 ]
[ -w student.txt ]
[ -e /root/install.sh]

if判断

if[条件判断是];then
 程序
fi

if[条件判断是]
 then
   程序
fi

注意 [条件判断式],中括号和条件判断式之间有空格

#!/bin/bash

if [ $1 -eq "123" ]
        then
        echo "123"
elif [ $1 -eq "456" ]
        then
        echo "456"
fi

[root@master opt]# ./if.sh  123
123
[root@master opt]# ./if.sh  456
456

case语句

 case $变量名 in
 "值1")
  如果变量的值等于值1,则执行程序1
  ;;
  "值2")
  如果变量的值等于值2,则执行程序2
  ;;
  ...其他分支...
  *)
  ;;
  esac

示例:输入1输出1;输入2,输出2,输入其他,输出other  
#!/bin/bash

case $1 in
"1")
        echo "1"
;;

"2")    echo "2"
;;

*)
        echo "other"
;;
esac

[root@master opt]# ./cash.sh  1
1
[root@master opt]# ./cash.sh  2
2
[root@master opt]# ./cash.sh  3
other

循环

1)for 变量 in 值1 值2 值3 ...
  do
    程序
  done
  
#!/bin/bash

for i in "$*"
do
    echo "$i"
done

for j in "$@"
do
        echo "$j"
done

执行
[root@master opt]# ./for1.sh  2 4 6 8
2 4 6 8
2
4
6
8

2)for((初始值;循环控制条件;变量变化))
  do
    程序
  done

  1加到100
#!/bin/bash

s=0
for((i=1; i<=100; i++))
do
        s=$[$s+$i]
done

echo $s

./for2.sh 
5050

3)while

while[ 条件判断式 ]
 do
   程序
 done
 
#!/bin/bash

s=0
i=0
while [ $i -le 100 ]
do
   s=$[$s+$i]
   i=$[$i+1]
done

echo "$s"

./while.sh 
5050

read读取控制台的输入

read(选项)(参数)
选项 
-p:指定读取值时的提示符
-t:指定读取值时等待的时间(秒)

[root@master opt]# read -p "input your name " NAME
input your name xiaoming
[root@master opt]# echo $NAME

read -t 3 -p "input your name " NAME #3秒内没输入 NAME的值为null

自定义函数

[ function ] funname[()]
{
		Action;
		[return int;]
}

funname

注意:
(1) 必须在调用函数地方之前,先声明函数
(2) 函数返回值,只能通过$?系统变量获得,可以显示加:
return返回,如果不加,将以最后一条命令运行结果,作为返回值
return后跟数值n

#!/bin/bash

function sum(){

  s=0
  s=$[$1+$2]
  echo "$s"
}

read -p "input num1 " NUM1
read -p "input num2 " NUM2

sum $NUM1 $NUM2;

[root@master opt]# ./function.sh 
input num1 1
input num2 4
5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值