【linux 命令行与shell脚本】

一、显示信息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 $var5var5=$(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   commandsfi
  •  

在bash shell中if后面的是一个命令,如果该命令的退出状态码是0(说明该命令执行成功),那么位于then后面的命令才会被执行。注意,这和其他编程语言的if语句返回true或false不一样。只要关注了这个,这个语句使用起来很容易:

if-then

2、if-then-else语句

在if-then语句中不管命令是否执行成功,你都只有一种选择:成功则执行then中的命令;命令失败则继续往下执行。有的情况下,我们需要使用if-then-else语句:

if command
then 
    commands
else
    commands
fi

这个语句的使用也很直观,请看以下示例:

if-else-then

3、嵌套if

如果使用上面的语句仍然不能很多好的满足要求,那我们可以使用嵌套if来工作:

if command1
then 
    commands
elif command2
thenelif command3thenelif command4then
    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 condition

如上图所示,我们在test命令里面测试一个存在的变量,会返回0,使得then中的语句会执行;相反则返回的退出状态码不为0。

test命令还有另一种常用的简便写法:单方括号 [ condition ],注意方括号距字符串必须加上一个空格。

var1=10.46
if [ $var1 \> 1 ]
then
echo OK
else
echo $?
echo fail
fi

test命令可以用来判断三类条件:

  1. 数值比较
  2. 字符串比较
  3. 文件比较

下面我们来学习这几种条件测试的使用方法,后面也会经常用到这些。

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


这里需要注意两个问题:

  1. 大于号和小于号必须转移,否则shell会把它们当做重定向符号,把字符串当做文件名
  2. 大于小于的排序是按照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 filefile是否存在并是一个目录
-f filefile是否存在并是一个文件
-e filefile是否存在
-r filefile是否存在并且可读
-w filefile是否存在并且可写
-s filefile是否存在并且非空
-x filefile是否存在并且可执行
-O filefile是否存在并且属当前用户所有
-G filefile是否存在并且默认组和当前用户相同
file1 -nt file2file1是否比file2新(new than)
file1 -ot file2file1是否比file2旧(old than)


这些条件使用起来也是比较简单的,我们应当先搞清楚逻辑再去做一系列的测试。

test file

如上所示,这里我们直接比较了两个文件的新旧,然而我们并没有确认这连个文件是否存在,如果没有存在的话,就可能得到一个错误的结果。我们可以使用布尔运算符来组合测试:

#复合条件测试
[ condition1 ] && [ condition2 ] 
[ condition1 ] || [ condition2 ]
  •  

test -nt

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来判断在哪个目录里面。不难发现使用case的场景还是比较多的。

以下转载来至https://blog.csdn.net/u011436666/article/details/73498354

 

七、for命令

下面是bash shell中for命令的基本格式:

for var in list
do 
    commands
done

在每次迭代过程中,变量var会包含列表中的当前值,$var变量包含着这次迭代对应的当前列表项中的值。可以通过以下几种方式来指定列表:

读取列表中的值: 
最简单的用法就是,直接指定一系列值,如下:

for1 
~

读取列表中的复杂值: 
我们先看以下,运行下面的脚本会输出什么:

#!/bin/bash

for test in I'm very happy today's night
do
    echo "The next string is $test"
done

可以发现,它将单引号中的字符串设别成了一个字符,所以没有达到我们想要的效果。

for2

有两种方法可以解决这个问题:

  • 使用转义字符\
  • 用双引号“ ”来定义用到的值

for循环默认认为每个值都是由空格分割的。

从变量读取值: 
使用起来也是很简单的,只是先定义了一个变量,如下所示:

for3

字符串拼接

<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开头的文件和文件夹。

for4

稍加修改就可以完成更加强大的功能,比如遍历某个目录下的文件和目录,并用test命令将其进行分类。

注意:我们可以在数据列表中放入任何东西,比如前面说到的数值、文件和目录。


使用C语言分风格的for命令:使用双小括号 
如同我们在shell-结构化命令之跳转中说到的在if语句重中使用双小括号来实现高级的数学表达式一样。for循环中也可以使用双小括号来实现C语言风格的变量引用方式(其实也类似于数学表达式),格式为for(( expression )),这里的表达式类似于C语言等语言中的。给一个简单的例子:

for5

 

嵌套循环,修改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脚本时可以尽量符合常用命令选项,使脚本更友好

常用linux命令选项
选项描述
-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[*]}



 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值