一、显示信息echo
1.不带回车打印 echo -n
simpim@DESKTOP-1ATCJJG ~
$ cat 1.sh
#!/bin/bash
echo -n "this a no1"
echo "second line"
simpim@DESKTOP-1ATCJJG ~
$ sh 1.sh
this a no1second line
2.特殊字符打印,使用\转义字符
echo "The cost of the item is \$15"
二、使用变量
1.set 命令查看当前环境变量
$ set
...
BASH=/bin/bash
HOME=/home/simpim
HOMEPATH='\Users\simpim'
HOSTTYPE=x86_64
IFS=$' \t\n'
...
二.打印变量
$ echo $HOME
/home/simpim
echo ${HOME}
2.用户变量
1).基本赋值
var1=10
echo "var1=$var1"
2)命令输出赋值
test=`date` 或者 test=$(date),其中date为命令
simpim@DESKTOP-1ATCJJG ~
$ test=$(date +%y%m%d)
simpim@DESKTOP-1ATCJJG ~
$ echo $test
180627
三、管道 |
管道被放在命令之间,将一个命令的输出重定向到另一个命令中
comdand1 | comdand2 | command3....
simpim@DESKTOP-1ATCJJG ~
$ cat sort.txt
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
eee:50:5.5
simpim@DESKTOP-1ATCJJG ~
$ cat sort.txt | sort
aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5
eee:50:5.5
四、数学运算
1.expr
$ expr 5 \* 2
10
2.方括号 $[ operation ]
$ echo $[5 * 2]
bash shell 数学运算只支持整数运算
$ echo $[ 45 / 10 ]
4
simpim@DESKTOP-1ATCJJG ~
$ expr 45 / 10
4
2.浮点运算 bc
1)scale只对除法、取余、乘幂有效,乘法无效
$ echo "scale=4;4.44444444/2" | bc
2.2222
2)bc 多个表达式计算
variable=$(bc << EOF
options
statements
expressions
EOF
)
#!/bin/bash
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=$(bc << EOF
scale=4
a1=($var1 * $var2)
b1 =($var3 *$var4)
a1+b1
EOF
)
echo the final answer for this mess is $var5
var5=$(bc << EOF
scale=4
a1=($var1 * $var2)
b1 =($var3 *$var4)
a1+b1
EOF
)
echo the final answer for this mess is $var5
五、退出脚本
1、查看命令执行的退出状态码
1) date;echo $?
0
成功结束的命令的退出状态码是0
$ abc || echo $?
-bash: abc: 未找到命令
127
2)exit命令指定脚本结束后返回指定的状态码
exit 5
六、结构化命令
以下转载 https://blog.csdn.net/u011436666/article/details/73480207
1、if-then语句
if-then语句格式如下:
if command
then
commands
fi
或者
if command;then
commands
fi
在bash shell中if后面的是一个命令,如果该命令的退出状态码是0(说明该命令执行成功),那么位于then后面的命令才会被执行。注意,这和其他编程语言的if语句返回true或false不一样。只要关注了这个,这个语句使用起来很容易:
2、if-then-else语句
在if-then语句中不管命令是否执行成功,你都只有一种选择:成功则执行then中的命令;命令失败则继续往下执行。有的情况下,我们需要使用if-then-else语句:
if command then commands else commands fi
这个语句的使用也很直观,请看以下示例:
3、嵌套if
如果使用上面的语句仍然不能很多好的满足要求,那我们可以使用嵌套if来工作:
if command1 then commands elif command2 then
elif command3
then
elif command4
then more commands fi
其实这里只是将else里面又嵌入了一个if-then语句,只是将else-if连起来写成了elif;我们可以随意组合嵌套,完成更复杂的逻辑。这里就不做示例了,很简单,并且后面经常会用到。
4、test命令
到目前为止,在if中用到的命令都是普通的shell命令,那么if后面是否可以测试出退出状态码以外的条件呢? 是不能的,但是我们可以用test命令来测试其他条件,只要test命令中列出的条件成立,test命令就会退出并返回退出状态码0,这样就可以完成类似于其他语言中那样的if-then语句了。
test命令的格式非常简单:test condition
,condition是命令要测试的一系列参数和值相当于我们用test命令代替了之前的command命令。
如上图所示,我们在test命令里面测试一个存在的变量,会返回0,使得then中的语句会执行;相反则返回的退出状态码不为0。
test命令还有另一种常用的简便写法:单方括号 [ condition ]
,注意方括号距字符串必须加上一个空格。
var1=10.46
if [ $var1 \> 1 ]
then
echo OK
else
echo $?
echo fail
fi
test命令可以用来判断三类条件:
- 数值比较
- 字符串比较
- 文件比较
下面我们来学习这几种条件测试的使用方法,后面也会经常用到这些。
1、数值比较:
数值比较功能如下表,可以用在数字和变量上。
比较 | 描述 |
---|---|
n1 -eq n2 | 检查n1与n2是否相等(equal) |
n1 -ge n2 | 检查n1是否大于或等于n2(greater、equal) |
n1 -gt n2 | 检查n1是否大于n2(greater than) |
n1 -le n2 | 检查n1是否小于或等于n2(less、equal) |
n1 -lt n2 | 检查n1小于n2(less than) |
n1 -ne n2 | 检查n1与n2是否不相等(not equal) |
~
需要记住,bash shell只能处理整数。
2、字符串比较:
比较 | 描述 |
---|---|
str1 = str2 | 检查str1和str2是否相同 |
str1 != str2 | 检查str1和str2是不同 |
str1 < str2 | 检查str1是否小于str2 |
str1 > str2 | 检查str1是否大于str2 |
-n str | 检查str的长度是否非0 |
-z str | 检查str长度是否为0 |
~
这里需要注意两个问题:
- 大于号和小于号必须转移,否则shell会把它们当做重定向符号,把字符串当做文件名
- 大于小于的排序是按照ASCII码的顺序(即由小到大为0~9,A~Z,a~z)
我们编辑如下的脚本,用来检测变量是否长度为0。
#!/bin/bash
value1=testing
value2=""
if [ -n $value1 ]
then
echo "Then string $value1 not empty"
else
echo "The string $value1 is empty"
fi
if [ -z $value2 ]
then
echo "The string $value2 is empty"
else
echo "The string $value2 is not empty"
fi
if [ -z $value3 ]
then
echo "The string $value3 is empty"
else
echo "The string $value3 is not empty"
fi
执行输出后,我们发现:定义了数值的变量长度不为0;而定义为空和未定义的变量其长度均为0。
Then string testing not empty
The string is empty
The string is empty
空的和为初始化的变量会对我们的脚本造成很大的影响。如果不确定其值的内容,在使用之前,最好可以用-n或-z测试一下是否含有值。
3、文件比较:
文件比较是shell编程中很强大也最常用的比较形式,它允许你测试Linux文件系统上的文件和目录的状态。比较形式如下表:
比较 | 描述 |
---|---|
-d file | file是否存在并是一个目录 |
-f file | file是否存在并是一个文件 |
-e file | file是否存在 |
-r file | file是否存在并且可读 |
-w file | file是否存在并且可写 |
-s file | file是否存在并且非空 |
-x file | file是否存在并且可执行 |
-O file | file是否存在并且属当前用户所有 |
-G file | file是否存在并且默认组和当前用户相同 |
file1 -nt file2 | file1是否比file2新(new than) |
file1 -ot file2 | file1是否比file2旧(old than) |
~
这些条件使用起来也是比较简单的,我们应当先搞清楚逻辑再去做一系列的测试。
如上所示,这里我们直接比较了两个文件的新旧,然而我们并没有确认这连个文件是否存在,如果没有存在的话,就可能得到一个错误的结果。我们可以使用布尔运算符来组合测试:
#复合条件测试
[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]
4、使用双小括号和双方括号
双小括号:
使用双小括号来使用高级数学表达式,提供了很多其他编程语言类似的运算符。格式如下:
(( expression ))
1、在双括号结构中,所有表达式可以像C语言一样,如:a++,b--等。
2、在双括号结构中,所有变量可以不加入:“$”符号前缀。
3、双括号可以进行逻辑运算,四则运算
4、双括号结构 扩展了for,while,if条件测试运算
5、支持多个表达式运算,各个表达式之间用“,”分开
#!/bin/sh
num=100;
total=0;
for((i=0;i<=num;i++));
do
((total+=i));
done
echo $total;
total=0;
i=0;
while((i<=num));
do
((total+=i,i++));
done
echo $total;
if((total>=5050));then
echo "ok";
fi
能够用在这里的表达式很多,比如:i++、i–、++i、–i之类的;逻辑求反!;一些布尔运算和位运算等等。在其他编程语言中可以用于的数学赋值或比较表达式等都可以用。
双方括号:
双方括号命令提供了针对字符串比较的高级特性。双方括号里面的表达式使用了test命令中采用的标准字符串比较。并且提供了模式匹配这个强大的特性。格式如下:
[[ expression ]]
我们再来总结一下几种括号的使用:
方括号[ ]:类似于test命令,用判断三类条件:数值、字符串、文件
双小括号(( )):在比较中使用高级数学表达式
双方括号[[ ]]:字符串比较的升级-模式匹配(并不是所有shell都支持?)
6、case命令-简化if-then-else
当我们尝试在一组可能的值中寻找特定值,再来进行其他操作时。可能需要写下很长的if-then-else语句,这时可以使用case语句来简化脚本,case命令的格式如下:
#可以通过或操作符|在一行中使用多个pattern
case variable in
pattern1) command1;;
pattern2|pattern3) command2;;
*) default commands;;
esac
上面这个简单的示例演示了获取当前目录并使用case来判断在哪个目录里面。不难发现使用case的场景还是比较多的。
以下转载来至https://blog.csdn.net/u011436666/article/details/73498354
七、for命令
下面是bash shell中for命令的基本格式:
for var in list
do
commands
done
在每次迭代过程中,变量var会包含列表中的当前值,$var变量包含着这次迭代对应的当前列表项中的值。可以通过以下几种方式来指定列表:
读取列表中的值:
最简单的用法就是,直接指定一系列值,如下:
~
读取列表中的复杂值:
我们先看以下,运行下面的脚本会输出什么:
#!/bin/bash
for test in I'm very happy today's night
do
echo "The next string is $test"
done
可以发现,它将单引号中的字符串设别成了一个字符,所以没有达到我们想要的效果。
有两种方法可以解决这个问题:
- 使用转义字符\
- 用双引号“ ”来定义用到的值
for循环默认认为每个值都是由空格分割的。
从变量读取值:
使用起来也是很简单的,只是先定义了一个变量,如下所示:
字符串拼接
<span style="color:#ff0000">list="l1 l2 l3 l4 l5 l6"
list=$list" l7" #字符拼接
for state in $list
do
echo "$state in the list"
done</span>
从命令读取值:
如下,使用$(command)
就可以将命令作为列表读入for循环中。
#!/bin/bash
for file in $(ls)
do
echo "The file/folder is $file"
done
这里显示了当前目录下的所有文件或文件夹名。
更改字段分隔符:
有个环境变量叫做IFS(internal field separator),即内部字段分隔符。默认情况下,bash shell将空格、制表符、换行符当做字段分隔符。可以这样来修改IFS的值:IFS=
,比如,我们可以使用如下代码,拆分当前路径:
#!/bin/bash IFS.OLD=$IFS IFS=/ for file in $(pwd) do echo "The path is: $file" done
<span style="color:#ff0000">list="l1;l2 :l3 l4; l5 l6 l8"
list=$list" l7"
#IFS=$' \t\n'
IFS=$'\t\n:;'
echo "$IFS"
for state in $list
do
echo "$state in the list"
done</span>
如果想使用多个分隔符,直接将其它们在赋值行串起来即可。这里了使用IFS.OLD=$IFS;IFS=/
先将默认的分隔符保存起来,使用完毕之后可以将其恢复。
使用通配符读取目录:
可以在for循环中使用通配符来处理目录中的文件。如下图所示我们匹配了用户目录下所有已test开头的文件和文件夹。
稍加修改就可以完成更加强大的功能,比如遍历某个目录下的文件和目录,并用test命令将其进行分类。
注意:我们可以在数据列表中放入任何东西,比如前面说到的数值、文件和目录。
使用C语言分风格的for命令:使用双小括号
如同我们在shell-结构化命令之跳转中说到的在if语句重中使用双小括号来实现高级的数学表达式一样。for循环中也可以使用双小括号来实现C语言风格的变量引用方式(其实也类似于数学表达式),格式为for(( expression ))
,这里的表达式类似于C语言等语言中的。给一个简单的例子:
嵌套循环,修改IFS环境变量遍历文件数据
#!/bin/bash
#处理/etc/passwd文件中的数据,逐行遍历文件,并将IFS变量的值改成冒号,分割每行中的各个数据段
IFS_OLD=$IFS
IFS=$'\n'
for entry in $(cat /etc/passwd) #entry一次性用IFS取出
do
echo "Value in $entry -"
IFS=:
for value in $entry
do
echo $value
done
done
八、while&until命令
while命令的格式如下:
while test command
do
other commands
done
test command这里和之前if中的test命令一模一样。
until命令和while的工作方式完全相反,其格式如下:
until test commands
other commands
done
直到test命令返回退出状态码为0时,循环才结束;退出状态码不为0时,往下执行循环。
while/until 使用多个测试命令(每个命令单独占一行),只有最后一个测试命令的退出状态码作为循环结束的判断条件
while echo $val1
[ $val1 -ge 0 ]
do
echo $val1
val1 = $[ $val1 - 1 ]
done
九、break&continue命令
和其他编程语言中的完全类似:
break用于:
- 跳出单个循环,此循环终止
- 跳出内部循环(嵌套循环时)
- 跳出外部循环(break n,用n指定外部循环的层级,默认情况下n为1,表示跳出当前循环
#!/bin/bash
for (( a = 1; a < 4; a++ ))
do
echo "Outer loop $a"
for (( b = 1; b < 100; b++ ))
if [ $b -gt 4 ]
then
break 2
fi
echo "Inner loop : $b"
done
done
continue用于:
- 提前终止某次循环,但并不会终止整个循环
- 类似的用 continue n
-
十、处理循环输出,使用管道或者重定向处理 > | < read命令
#!/bin/bash
#-----------------1. > ----------------------
for file in /home/rich/*
do
if [ -d $file ]
then
echo "$file is a directory"
elif
echo "$file is a file"
fi
done > output.txt
#-----------------2. | ----------------------
for state in "North Dakota" china hongkong
do
echo "$state is the next place to go"
done | sort
#for 命令的输出结果传递给了sort,实际的输出结果已经排序
#-----------------3. < ----------------------
#创建多个用户
#read命令会自动读取.csv文本文件中的下一行内容 rich,Richard Blum
input="users.csv"
while IFS=',' read -r userid name
do
echo "adding $userid"
useradd -C "$name" -m $userid
done < "$input"
五、处理用户输入(参数${10}、basename)
1.命令行参数 $0~$9 ${10} ${n} #n>=10
2.basename: name=${basename $0} basename命令返回不包含路径的脚本命
3.判断命令行参数是否存在
#!/bin/bash
if [ -n "$1" ]
then
echo hell ,$1
else
echo sorry ,I don`t know you
fi
4.特殊参数变量(shift n,$0, $#, $*, $@, $?, $$)
$# 脚本运行时携带的参数个数
shift命令会将所有参数的位置移动一个位置,当第一个参数的长度为0时,循环结束。注意:使用shift时,参数会被移除丢弃,无法恢复。
shift n,指定移动的位数,可以跳过不需要的参数。
#!/bin/bash
count=1
while [ -n "$1" ]
do
echo "Parameter #$count = $1 "
count=$[ $count + 1 ]
shift
done
#本段代码来自https://blog.csdn.net/u011341352/article/details/53215180/
Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
特殊变量列表
变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。一般情况下,大部分命令执行成功会返回 0,失败返回 1。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
$* 和 $@ 的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
下面的例子可以清楚的看到 $* 和 $@ 的区别:
#!/bin/bash
echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\$@=" $@
echo "\"\$@\"=" "$@"
echo "print each param from \$*"
for var in $*
do
echo "$var"
done
echo "print each param from \$@"
for var in $@
do
echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
echo "$var"
done
执行 ./test.sh "a" "b" "c" "d",看到下面的结果:
$*= a b c d
"$*"= a b c d
$@= a b c d
"$@"= a b c d
print each param from $*
a
b
c
d
print each param from $@
a
b
c
d
print each param from "$*"
a b c d
print each param from "$@"
a
b
c
d
说明:双引号包含时,"$*"的参数被当做一个整体,而"$@"还是遍历每一个参数
十一、处理用户输入
1、查找选项
#!/bin/bash
echo
while [ -n "$1" ]
do
case "$1" in
-a) echo "found the -a option" ;;
-b) echo "found the -b option" ;;
*) echo "$1 is not an option" ;;
esac
shift
done
2、分离参数和选项 --
shell 会用双破折线来表明选项列表结束
#!/bin/bash
echo
while [ -n "$1" ]
do
case "$1" in
-a) echo "-a"
-b) echo "-b"
--) shift
esac
shift
done
count=1
for param in $@
do
echo "parameter #$count : $param"
count=$[ $count + 1 ]
done
2.getopts 命令格式: getopts optstring variable
getopts命令会用到两个环境变量,如果选项需要跟一个参数值,OPTARG环境变量会保存这个值,OPTING环境变量保存了参数列表中getopts正在处理的参数的位置。
#!/bin/bash
#processing options & parameters with getopts
echo
while getopts :ab:cd opt
do
case "$opt" in
a) echo "Found the -a option" ;;
b) echo "Found the -b option,with value $OPTARG" ;;
c) echo "Found the -c option" ;;
d) echo "Found the -d option" ;;
*) "Unknow option: $opt" ;;
esac
done
shift $[ $OPTIND -1 ]
echo
count=1
for param in "$@"
do
echo "Parameter $count:$param"
count=$[ $count + 1 ]
done
3.选项标准化
在创建shell脚本时可以尽量符合常用命令选项,使脚本更友好
选项 | 描述 |
-a | 显示所有对象 |
-c | 生成一个计数 |
-d | 制定一个目录 |
-e | 扩展一个对象 |
-f | 指定读入数据的文件 |
-h | 显示命令的帮助信息 |
-i | 忽略文本大小写 |
-l | 产生输出的长格式版本 |
-n | 使用非交互模式(批处理)) |
-o | 将所有的输出重定向到指定的输出文件 |
-q | 以安静模式运行 |
-r | 递归处理目录和文件 |
-s | 以安静模式运行 |
-v | 生成详细输出 |
-x | 排除某个对象 |
-y | 对所有问题回答yes |
十二、read 获取用户输入
#!/bin/bash
#超时、读取字符长度、隐藏方式读取-s 、从文本中读取
echo -n enter your name
if read -t 5 -p "enter your name" name
then
echo "hello $name"
else
echo "sorry timeout"
fi
#输入密码 read -s
read -s -p "Enter your password"
#字符长度限制 read -n$num
read -n1 -p "Do you want to go [Y|N]?" answer
case $answer in
Y | y) echo
echo "ok, go"
N | n) echo
echo ok,goobye
exit;;
esac
#从文本中读取
count=1
cat test | while read line
do
echo "Line $count : $line"
done
十三、文件描述符与重定向
1.STDIN(0) STDOUT(1) STDERR(2)
#!/bin/bash
outfile='members.sql'
IFS=','
while read lname fname address city state zip
do
cat >> $outfile << EOF
INSERT INTO members (lname,fname,address,city,state,zip) VALUES
('$lname','$fname','$address','$city','$state','$zip');
EOF
done < ${1}
#done < ${1} 指定read从脚本输入参数的文本中读取
# cat >> $outfile << EOF:EOF指定数据的起止
#./test23 < members.csv
# members.csv: Blum,Richard,123 Main St.,Chicago,IL,60601
#
重定向错误与数据
1)ls -al test test2 test3 badtest 2> test6 1> test7
2)&>:将STDERR与STDOUT输出重定向到同一个文件
3)临时重定向在数字前加&: echo "this" > &2
4)永久重定向: exec 1 > testout
5)重定向输入: exec 0 < testfile
#!/bin/bash
exec 0< testfile
count=1
while read line
do
echo "Line $count : $line"
count=$[ $count + 1 ]
done
6)创建自己的重定向(3~8数字可以用于自定义描述符),恢复已重定向的文件描述符
#!/bin/bash
exec 3>&1
exec 1 > testout
echo " This should store in the output file"
exec 1>&3
echo "Now things should be back to normal"
7)关闭文件描述符 exec 3>&-
8)列出打开的文件描述符lsof: lsof -a -p
9)阻止输出: >/dev/null : ls -al > /dev/null
十四、创建临时文件
1)创建临时文件
mktemp会用6个字符码替换着6个X
mktemp testing.XXXXXX
2)在/tmp目录下创建临时文件
mktemp -t test.XXXXXX
3)创建临时目录
mktemp -d dir.XXXXXX
#!/bin/bash
tempdir=$(mktemp -d dir.XXXXXX)
cd $tempdir
tempfile1=$(mktemp temp.XXXXXX)
tempfile2=$(mktemp temp.XXXXXX)
exec 7 > $tempfile1
exec 8 > $tempfile2
echo "Sending data to directory $tempdir"
echo "This is a test line of data for $tempfile1" >&7
echo "This is a test line of data for $tempfile2" >&8
4)记录消息 tee
tee -a filename (-a 文本追加)
tee命令将STDIN过来的数据同时发往两处,STDOUT和tee指定的文件
十五、后台运行与定时运行
1)nohup ./test.sh & : nohup自动将输入输出重定向到nohup.out文件中
2)定期执行:cron 时间表
min hour dayofmonth month dayofweek command
明天10:15运行 : 15 10 * * * comomand
dayofmonth 取值(1~31) dayofweek取值(0~6,0为周日)
每月最后一天执行: 00 12 * * * if [ `date +%d -d tommorrow` = 01 ] ; then ; command
crontab -l查看cron时间表
cron唯一的问题是,假如某个作业在cron时间表中安排的时间已到,而linux系统处于关机状态,该作业不会被执行,重新开机后,系统不会执行错过的作业,而anacron可以。
3)anacron
period delay identifier command
4)cat .bashrc
修改.bashrc文件可以在用户打开新的shell启动时运行指定的脚步
十六、创建函数
1. 创建函数的两种格式
function name {
commands
} 或者
name()
{
commands
}
2.函数返回值
1)默认退出状态码:默认情况下,函数的退出码是函数中最后一条命令的返回的退出状态码。
2)使用return 命令返回值(退出码必须是0~·255之间)
#!/bin/bash
function db1 {
read -p "Enter a value: " value
return $[ $value * 2 ]
}
dbl
echo "The new value is $?"
3)使用函数输出
#!/bin/bash
function db1 {
read -p "Enter a value: " value
echo $[ $value * 2 ]
}
result =$(db1) # result=`db1`
echo "The new value is $result"
3.在函数中使用变量(参数传递)
#!/bin/bash
function func7 {
echo $[ $1 * $2 ]
}
if [ $# -eq 2 ]
then
value=$(func7 $1 $2)
echo "The result is $value"
else
echo "Usage : badtest1 a b"
fi
#./test7 10 15
1)全局变量和局部变量(local temp)
默认情况下,在脚本中定义的任何变量都是全局变量,可以在shell脚本中的任何地方使用。
#!/bin/bash
function func1 {
local temp=$[ $value +5 ]
result=$[ $temp * 2 ]
}
temp=4
value=6
func1
echo "The result is $result"
if [ $temp -gt $value ]
then
echo "temp is larger"
else
echo "temp is smaller"
fi
#./test9->22->smaller
3.数组变量和函数
1)向函数传递数组参数
#!/bin/bash
function testit {
echo "The parameters are : $@"
thisarray=$1
echo "The received array is ${thisarray[*] }"
}
myarray=(1 2 3 4 5)
echo "the original array is : ${myarray[*]}"
testit $myarray
#The parameters are 1
#如果你试图将数组变量作为函数参数,函数只会取数组变量的第一个值
function testit1 {
local newarray
newarray=(;'echo "$@"')
echo "The new array value is : ${newarray[*]}"
}
myarray1=(1 2 3 4 5)
echo "the original array is : ${myarray1[*]}"
testit1 ${myarray1[*]}