学习视频链接
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
[root@localhost shell]# sh ./hello_world.sh
Hello World !
[root@localhost shell]# bash /home/oracle/Desktop/shell/hello_world.sh
Hello World !
[root@localhost shell]# chmod +x hello_world.sh
[root@localhost shell]# ./hello_world.sh
Hello World !
[root@localhost shell]# /home/oracle/Desktop/shell/hello_world.sh
Hello World !
注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
[root@localhost shell]# source hello_world.sh
Hello World !
[root@localhost shell]# . hello_world.sh
Hello World !
前两种方法都是在当前shell中打开一个子shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell中。
第三种,也就是使用在脚本路径前面加“.”或者“source”的方法,可以使脚本内容在当前shell里执行,而无需打开子shell!这也是为什么我们每次修改完/etc/profile文件以后,需要source一下的原因。
开子shell与不开子shell的区别就在于环境变量的继承关系,如在子shell中设置的当前变量,父shell是不可见的。
$HOME $PWD $SHELL $USER 等
[root@localhost shell]# echo $HOME
/root
[root@localhost shell]# set | less
(1)定义变量:变量名=变量值,注意:=号前后不能有空格
(2)撤销变量:unset 变量名
(3)声明静态变量:readonly变量,注意:不能unset
[root@localhost shell]# my_var='hello world'
[root@localhost shell]# echo $my_var
hello world
[root@localhost shell]# export my_var #用export提升为全局变量
[root@localhost shell]# bash #定义一个子bash
[root@localhost shell]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 21650 21638 0 14:48 pts/0 00:00:00 -bash
root 32288 21650 0 17:30 pts/0 00:00:00 bash #此时查看就出现了一个子shell
root 32341 32288 0 17:31 pts/0 00:00:00 ps -f
[root@localhost shell]# echo $my_var #现在已在子shell中,但是查看变量已能显示。
hello world
[root@localhost shell]# export my_var #用export提升为全局变量
[root@localhost shell]# bash #定义一个子bash
[root@localhost shell]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 21650 21638 0 14:48 pts/0 00:00:00 -bash
root 32288 21650 0 17:30 pts/0 00:00:00 bash #此时查看就出现了一个子shell
root 32341 32288 0 17:31 pts/0 00:00:00 ps -f
[root@localhost shell]# echo $my_var #现在已在子shell中,但是查看变量已能显示。
hello world
[root@localhost shell]# my_var='my var is hello world' #在子shell中重新定义变量值
[root@localhost shell]# echo $my_var
my var is hello world
[root@localhost shell]# exit #登出子shell,到父shell中
exit
[root@localhost shell]# echo $my_var
hello world #此时发现父shell中变量仍然为最开始的变量值,说明变量更改只在当前范围内有效。(在子shell更改的变量值,不作用于父shell中。)
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
[root@localhost ~]# readonly a=5
[root@localhost ~]# echo $a
5
[root@localhost ~]# a=6
-bash: a: 只读变量
$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,例如: ${10} )
[root@localhost shell]# vim hello.sh #在里面输入以下脚本
#!/bin/bash
echo '========$n========'
echo script name: $0
echo 1st paramater: $1
echo 2nd paramater: $2
[root@localhost shell]# sh hello.sh 110 120 #运行脚本,脚本后跟上对应参数
========$n========
script name: hello.sh
1st paramater: 110
2nd paramater: 120
$# (功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)
[root@localhost shell]# vim hello.sh #在里面输入以下脚本
#!/bin/bash
echo '========$n========'
echo script name: $0
echo 1st paramater: $1
echo 2nd paramater: $2
echo '========$#========'
echo $#
[root@localhost shell]# sh hello.sh 110 120 #运行脚本,脚本后跟上对应参数
========$n========
script name: hello.sh
1st paramater: 110
2nd paramater: 120
========$#========
2
$* (功能描述:这个变量代表命令行中所有的参数, $*把所有的参数看成一个整体 )
以一个单字符串显示所有向脚本传递的参数。
如" $ * “用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@ (功能描述:这个变量也代表命令行中所有的参数,不过 $@把每个参数区分对待)
与 $*相同,但是使用时加引号,并在引号中返回每个参数。
如" $@ “用「”」括起来的情况、以"$1" “$2” … " $n " 的形式输出所有参数。
[root@localhost shell]# vim hello.sh #在里面输入以下脚本
#!/bin/bash
echo '========$n========'
echo script name: $0
echo 1st paramater: $1
echo 2nd paramater: $2
echo '========$#========'
echo paramater numbers:$#
echo '========$*========'
echo $*
echo '========$@========'
echo $@
[root@localhost shell]# sh hello.sh 110 120 #运行脚本,脚本后跟上对应参数
========$n========
script name: hello.sh
1st paramater: 110
2nd paramater: 120
========$#========
paramater numbers: 2
========$*========
110 120
========$@========
110 120
$? (功能描述:最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确。)
判断hello.sh脚本正确执行
[root@localhost shell]# echo $?
0
[root@localhost shell]# paramater.sh
bash: paramater.sh: 未找到命令...
[root@localhost shell]# echo $?
127
Shell 和其他编程语言一样,支持多种运算符,包括:
“$((运算式))” 或 “ $[运算式]”
实例:
[root@localhost shell]# echo $((3+5))
8
[root@localhost shell]# echo $[3+5]
8
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举列 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30 |
- | 减法 | expr $a - $b 结果为 -10 |
* | 乘法 | expr $a \* $b 结果为 200 |
/ | 除法 | expr $b / $a 结果为 2 |
% | 取余 | expr $b % $a 结果为 0 |
= | 赋值 | a=$b 把变量 b 的值赋给 a |
== | 相等。用于比较两个数字,相同则返回 true | [ $a == $b ] 返回 false |
!= | 不相等。用于比较两个数字,不相同则返回 true | [ $a != $b ] 返回 true |
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a== $b] 是错误的,必须写成 [ $a == $b ]。
实例:
[root@localhost ~]#vim arithmetic.sh #在文本里输入以下内容
#!/bin/bash
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
[root@localhost ~]#sh arithmetic.sh
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
注意:
乘号( * )前边必须加反斜杠( \ )才能实现乘法运算;
在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 " * " 不需要转义符号 " \ " 。
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举列 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true | [ $a -eq $b ] 返回 false |
-ne | 检测两个数是否不相等,不相等返回 true | [ $a -ne $b ] 返回 true |
gt | 检测左边的数是否大于右边的,如果是,则返回 true | [ $a -gt $b ] 返回 false |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true | [ $a -lt $b ] 返回 true |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true | [ $a -ge $b ] 返回 false |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true | [ $a -le $b ] 返回 true |
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举列 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true | [ ! false ] 返回 true |
-o | 或运算,有一个表达式为 true 则返回 true | [ $a -lt 20 -o $b -gt 100 ] 返回 true |
-a | 与运算,两个表达式都为 true 才返回 true | [ $a -lt 20 -a $b -gt 100 ] 返回 false |
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举列 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
ll | 逻辑的 OR | [[ $a -lt 100 ll $b -gt 100 ]] 返回 true |
下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:
运算符 | 说明 | 举列 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true | [ $a = $b ] 返回 false |
!= | 检测两个字符串是否不相等,不相等返回 true | [ $a != $b ] 返回 true |
-z | 检测字符串长度是否为0,为0返回 true | [ -z $a ] 返回 false |
-n | 检测字符串长度是否不为 0,不为 0 返回 true | [ -n “$a” ] 返回 true |
$ | 检测字符串是否为空,不为空返回 true | [ $a ] 返回 true |
文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
运算符 | 说明 | 举列 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true | [ -e $file ] 返回 true。 |
其他检查符:
-S: 判断某文件是否 socket。
-L: 检测文件是否存在并且是一个符号链接。
条件判断语法:
(1)test condition
(2)[ condition ] (注意condition前后要有空格)
注意:条件非空即为true,[ atguigu ] 返回true,[ ] 返回false。
[root@localhost shell]# a=521
[root@localhost shell]# echo $a
521
[root@localhost shell]# test $a = 521
[root@localhost shell]# echo $?
0
[root@localhost shell]# test $a = 520
[root@localhost shell]# echo $?
1
[root@localhost shell]# [ $a = 521 ]
[root@localhost shell]# echo $?
0
[root@localhost shell]# [ $a = 520 ]
[root@localhost shell]# echo $?
1
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
注意事项:
[root@localhost shell]# vim if_test.sh #在脚本文件里输入以下内容
#!/bin/bash
if [ "$1"x = "atguigu"x ]
then
echo "welcome to, atguigu"
fi
[root@localhost shell]# sh if_test.sh atguigu #执行脚本,输出内容。但后面内容不是“atguigu”,则不输出内容
welcome to, atguigu
[root@localhost shell]# a=20
[root@localhost shell]# if [ $a -gt 18 ] && [ $a -lt 35 ];then echo OK; fi
OK
[root@localhost shell]# if [ $a -gt 18 -a $a -lt 35 ];then echo OK; fi
OK #此处-a是逻辑与的表达式,相当于and;-o为逻辑或,相当于or.
[root@localhost shell]# vim if_else.sh #在脚本文件里输入以下内容
#!/bin/bash
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
[root@localhost shell]# sh if_else.sh #执行脚本,得出结果
a 小于 b
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
*注意事项:
下面的脚本提示输入 1 到 4,与每一种模式进行匹配:
[root@localhost shell]# vim case_esac.sh 在脚本文件里输入#!到esac以下的内容
#!/bin/bash
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你输入的是 1'
;;
2) echo '你输入的是 2'
;;
3) echo '你输入的是 3'
;;
4) echo '你输入的是 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
[root@localhost shell]# sh case_esac.sh #执行脚本
输入 1 到 4 之间的数字:
你输入的数字为:
3
你输入的是 3
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
从1加到100
[root@localhost shell]# vim for.sh
#!/bin/bash
sum=0
for ((i=0;i<=100;i++)) #双小括号下可以用数学上的一些符号,运算式
do
sum=$[ $sum+$i ]
done
echo $sum
[root@localhost shell]# sh for.sh
5050
for 变量 in 值1 值2 值3
do
程序
done
[root@localhost shell]# vim shell_for_more.sh
#!/bin/bash
for loop in 1 2 3 4 5 6
do
echo "The value is : $loop"
done
[root@localhost shell]# sh shell_for_more.sh
The value is : 1
The value is : 2
The value is : 3
The value is : 4
The value is : 5
The value is : 6
[root@localhost shell]# for i in {1..100}; do sum=$[$sum+$i]; done; echo $sum
5050 #从1加到100
[root@localhost shell]# vim for2.sh
#!/bin/bash
echo '========$*========'
for i in $*
do
echo "1 2 3 $i"
done
echo '========$@========'
for j in $@
do
echo "1 2 3 $j"
done
[root@localhost shell]# sh for2.sh 4 5 6
========$*========
1 2 3 4
1 2 3 5
1 2 3 6
========$@========
1 2 3 4
1 2 3 5
1 2 3 6
#当它们被双引号“”包含时,$*会将所有的参数作为一个整体,以“$1 $2 ... $n”的形式输出所有参数;$@会将各个参数分开,以“$1” “$2” ... “$n”的形式输出所有参数。
[root@localhost shell]# vim for2.sh
#!/bin/bash
echo '========$*========'
for i in "$*"
do
echo "1 2 3 $i"
done
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
echo '========$@========'
for j in "$@"
do
echo "1 2 3 $j"
done
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
[root@localhost shell]# sh for2.sh 4 5 6
========$*========
1 2 3 4 5 6
========$@========
1 2 3 4
1 2 3 5
1 2 3 6
while [ 条件判断式 ]
do
程序
done
从1加到100
[root@localhost shell]# vim for.sh 编辑for脚本,在下面添加以下内容
#用while循环实现
a=1
while [ $a -le 100 ]
do
sum2=$[ $sum2 + $a ]
a=$[$a + 1]
done
echo $sum2
[root@localhost shell]# sh for.sh
5050
5050
until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。
until [ 条件判断式 ]
do
程序
done
以下实例我们使用 until 命令来输出 0 ~ 9 的数字:
[root@localhost shell]# vim until.sh
#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
[root@localhost shell]# sh until.sh
0
1
2
3
4
5
6
7
8
9
下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。
[root@localhost shell]# vim break.sh
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
break
;;
esac
done
[root@localhost shell]# sh break.sh
输入 1 到 5 之间的数字:3
你输入的数字为 3!
输入 1 到 5 之间的数字:7
你输入的数字不是 1 到 5 之间的! 游戏结束
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
对上面的例子进行修改:
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done
运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo “游戏结束” 永远不会被执行。
read (选项) (参数)
[root@localhost shell]# vim read.sh
#!/bin/bash
read -t 10 -p "请输入你的名字:" name
echo "welcome to $name"
[root@localhost shell]# sh read.sh
请输入你的名字:china
welcome to china
一个程序需要有0个或以上输入,一个或更多输出
功能:将内容输出到默认显示设备
echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。功能说明:显示文字。语法:echo [-ne][字符串]
补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在最后加上换行号。
命令选项;
-n不要在最后自动换行
-e若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出;转义字符
\a发出警告声;
\b删除前一个字符;
\c最后不加上换行符号;
\f换行但光标仍旧停留在原来的位置;ln换行且光标移至行首;
\r光标移至行首,但不换行;
\t插入tab;
\w与Mf相同;
\插入I字符;
\nnn插入nnn(八进制)所代表的ASCII字符;
-help显示帮助
-version显示版本信息
#输出9-1的倒计时
[root@localhost shell]# cat time.sh
#!/bin/bash
for time in `seq 9 -1 0`;do
echo -n -e "\b$time"
sleep 1
done
echo
脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e格式如下:
echo -e “\033[背景色;字体颜色 字符串 \033[属性效果”
例如;
echo -e “\033[41;36m something here \033[0m”
其中41的位置代表底色,36的位置是代表字的颜色
1、字背景颜色和文字颜色之间是英文的""
2、文字颜色后面有个m
3、字符串前后可以没有空格,如果有的话,输出也是同样有空格
下面是相应的字和背景颜色,可以自己来尝试找出不同颜色搭配
例:
echo -e “\033[31m 红色字 \033[0m"
echo -e “\033[34m 黄色字 \033[0m”
echo -e “\033[41;33m 红底黄字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
字颜色:30–37
echo -e “\033[30m 黑色字 \033[0m”
echo -e “\033[31m 红色字 \033[0m"
echo -e “\033[32m 绿色字 \033[0m”
echo -e “\033[33m 黄色字 \033[0m”
echo -e “\033[34m 蓝色字 \033[0m"
echo -e “\033[35m 紫色字 \033[0m”
echo -e “\033[36m 天蓝字 \033[0m”
echo -e “\033[37m 白色字 \033[0m”
字背景颜色范围:40–47
echo -e “\033[40;37m 黑底白字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
echo -e “\033[42;37m 绿底白字 \033[0m”
echo -e “\033[43;37m 黄底白字 \033[0m”
echo -e “\033[44;37m 蓝底白字 \033[0m”
echo -e “\033[45;37m 紫底白字 \033[0m”
echo -e “\033[46;37m 天蓝底白字 \033[0m”
echo -e “\033[47;30m 白底黑字 \033[0m”
最后面控制选项说明
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m - \33[37m
设置前景色
\033[40m - \33[47m 设置背景色
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH 设置光标位置
\033[23 清屏
\033[K 清除从光标到行尾的内容
\33[s 保存光标位置
\033[u 恢复光标位置
\033[?251 隐藏光标
\033[?25h 显示光标
basename [ string / pathname ] [ suffix ]
(功能描述:basename命令会删掉所有的前缀包含最后一个(‘/’)字符,然后将字符串显示出来。)
basename可以理解为取路径里的文件名称。
选项
suffix为后缀,如果suffix被指定了,basename会被pathname或string中的suffix去掉。
[root@localhost shell]# vim hello.sh
#!/bin/bash
echo '========$n========'
echo script name: $(basename $0 .sh) #获取路径中的文件名称
echo 1st paramater: $1
echo 2nd paramater: $2
echo '========$#========'
echo paramater numbers: $#
echo '========$*========'
echo "$*"
echo '========$@========'
echo "$@"
[root@localhost shell]# /home/oracle/Desktop/shell/hello.sh 1 2
========$n========
script name: hello
1st paramater: 1
2nd paramater: 2
========$#========
paramater numbers: 2
========$*========
1 2
========$@========
1 2
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
dirname 可以理解为取文件路径的绝对路径的部分
[root@localhost shell]# vim hello.sh
#!/bin/bash
echo '========$n========'
echo script name: $(basename $0 .sh) #获取路径中的文件名称
echo script path: $(cd $(dirname $0); pwd)
echo 1st paramater: $1
echo 2nd paramater: $2
echo '========$#========'
echo paramater numbers: $#
echo '========$*========'
echo "$*"
echo '========$@========'
echo "$@"
[root@localhost shell]# cd ../../
[root@localhost oracle]# ../../home/oracle/Desktop/shell/hello.sh 1 2
========$n========
script name: hello
script path: /home/oracle/Desktop/shell
1st paramater:1
2nd paramater:2
========$#========
paramater numbers: 2
========$*========
1 2
========$@========
1 2
[ function ] funname[()]
{
Action
[return int;]
}
输入两个数字进行求和
[root@localhost shell]# vim fun_test.sh
#!/bin/bash
function add(){
s=$[$1+$2]
echo $s
}
read -t 30 -p "请输入第一个整数:" a
read -t 30 -p "请输入第二个整数:" b
sum=$(add $a $b)
echo "和:"$sum
[root@localhost shell]# sh fun_test.sh
请输入第一个整数:34
请输入第二个整数:12
和:46
返回首页