威尼斯wns.9778官网活动_vnsc威尼斯城官网

热门关键词: 威尼斯wns.9778官网活动,vnsc威尼斯城官网
当前位置:威尼斯wns.9778官网活动 > 计算机教程 > shell 使用数组作为函数参数的方法(详解)

shell 使用数组作为函数参数的方法(详解)

文章作者:计算机教程 上传时间:2019-05-11

因工作需要,需要使用shell开发一些小工具,当使用数组作为函数参数时,发现只能传递数组的第一个元素,数组后面的元素不能传递到函数内。

本文章从五个方面来介绍linux中shell命令,包括有Shell变量、Shell的基本结构、Shell函数的返回值、Shell函数详解 、Shell当中的特殊变量 希望能对初学者有所帮助。

#!/bin/bash

function showArr(){

  arr=$1

  for i in ${arr[*]}; do
    echo $i
  done

}

regions=("GZ" "SH" "BJ")

showArr $regions

exit 0

Shell入门教程:Shell变量   

把代码保存为test.sh后执行,只输出了第一个元素。

变量

./test.sh
GZ

变量是暂时用来存储数据的地方,是一个内存空间。bash shell和其他的编程语言,没有“数据形态”,也就是说默认情况下不区分一个变量是整型还是浮点型等,除非你使用declare语句申明变量类型。在bash shell中,默认只有一种数据型,就是由字符组成的字符串。同时,设定的变量只在当前的shell中存在,也就是,每一个shell都会维护一份他们自己的变量,彼此不会有影响。可以把变量导出成环境变量,这样其他的shell就可以被子shell引用。

$1表示获取函数的第一个参数,而函数的第一个参数就是regions数组,这样就奇怪了,为什么只能获取到数组的第一个元素呢?

变量的命名规则:

经测试

1.可以使用英文字母、数字和下划线组成

echo $regions

2.第一个字符不能是数字

只会输出第一个元素,所以使用regions作为参数传递,只会传递第一个元素。

3.区分大小写

因此需要把参数写成 “${regions[*]}” 才可以作为数组传递。

变量设定:

代码修改后如下:

变量名=值

#!/bin/bash

function showArr(){

  arr=$1

  for i in ${arr[*]}; do
    echo $i
  done

}

regions=("GZ" "SH" "BJ")

showArr "${regions[*]}"

exit 0

例如:name=john

运行后输出数组所有元素,因此修改后可以把数组作为函数参数传递使用。

建议这样设定变量:name="john" 或者name='john'

./test.sh
GZ
SH
BJ

在引用变量的时候使用双引号和单引号是有区别的,单引号不会进行变量替换。而在双引号中,如果也想抑制变量替换,则需要使用转义符反斜线

以上这篇shell 使用数组作为函数参数的方法(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

引用变量:

您可能感兴趣的文章:

$变量名

建议这样引用变量:${变量名}

环境变量:

使用下面的任意一个方法可以使name变为环境变量

name="john"
export name
export name="john"
declare -x name="john"
bash的一些重要的内置变量:

$1 ~ $n?   参数位置。当n超过9后,使用${n},例如${10}
$*   代表所有的参数位置,而且视为一个字符串
[email protected]   代表所有的参数位置,但是代表各位置参数组成的串行
$#    参数的个数
$?    上一个命令的返回值
$!    上一个后台进程的编号
$$   目前shell的进程编号  

Shell的基本结构 

shell程序的基本组成结构

shell结构大体是由设定变量、内置命令、shell的语法结构、函数组成。

使用实例说明:test.sh

 代码如下

复制代码

#!/bin/bash
#说明使用/bin/bash作为这个脚本的解释器
#定义一个函数
function my_fun () {
 echo "Hello, $1,today is $2"
}
#定义连个变量
name=$1
today=`date`
#函数调用
my_fun "$name" "$today"

上面的这个脚本要想运行还需要做一些操作,首先给予执行权限

chmod x test.sh
然后执行

./test.sh john
输出

Hello, john,today is Tue Jun? 1 14:51:46 CST 2010
父shell和子shell

在执行script之前,身处的环境就是父shell。执行script之时,父shell根据#!/bin/bash,fork出来一个新的shell环境,然后在子shell中执行,执行完毕后子shell结束,任然回到父shell中,这样不会影响到父shell的环境。  

这张图片是login shell的流程,当是non-login shell时,只执行方框中的标注的部分。由这张图我们可以知道,在如下几种情况下,执行的流程。

登陆(login)

/etc/profile
~/.bash_profile
注销(logout)

~/.bash_logout
执行新shell,分成两种情况

1.执行交互式的shell

~/.bashrc
/etc/bashrc
2.执行非交互式的shell,比如执行script会检查 BASH_ENV 变量的内容,如果有定义,则执行。

Shell函数的返回值   

shell函数返回值一般有3种方式:

1、return语句(默认的返回值)

shell函数的返回值可以和其他语言的返回值一样,通过return语句返回。

比如:

 代码如下

复制代码

#!/bin/bash
function mytest() {
 
 echo "mytest function"
 echo "argv[1] = $1"

 if [ $1 = "1" ] ;then
  return 1
 else
  return 0
 fi

}

echo "mytest 1"
mytest 1
echo $?

echo "mytest 0"
mytest 0
echo $?

if mytest 1 ; then
 echo "mytest 1"
fi

if mytest 0 ;then
 echo "mytest 0"
fi

echo "end"

先定义了一个函数,mytest,它根据输入的参数是否为1来return 1,否则return 0。

获取函数的返回值通过调用函数,或者最后执行的值获得。

另外,可以直接用函数的返回值用作if的判断。

注意:return只能用来返回整数值,且和c的区别是返回为正确,其他的值为错误。

2、全局变量或者环境变量

这种就类似于c中的全局变量。

 代码如下

复制代码

#!/bin/bash

g_var=

function mytest2() {
 echo "mytest2"
 echo "args $1"
 g_var=$1
 return 0
}

mytest2 1

echo "g_var=$g_var"

函数mytest2通过修改全局变量的值来返回结果。

3、以上两个方法失效的时候

以上介绍的这两种方法在一般情况下都是好使的,但也有例外。

比如:

 代码如下

复制代码

#!/bin/bash

function mytest3() {
 grep "123" test.txt | awk -F: '{print $2}' | while read line ;do
 echo "$line"
 if [ $line = "yxb" ]; then
  return 0
 fi
 done
 echo "mytest3 here "
 return 1
}

g_var=

function mytest4() {
 grep "123" test.txt | awk -F: '{print $2}' | while read line ;do
 echo "$line"
 if [ $line = "yxb" ]; then
  g_var=0
  echo "g_var=0"
  return 0
 fi
 done
 echo "mytest4 here "
 return 1
}

mytest3
echo $?

mytest4
echo "g_var=$g_var"

test.txt中的内容如下:

 代码如下

复制代码

456:kkk
123:yxb
123:test

输出如下:

[email protected]:~/文档/个人文档/shell函数返回值$ ./no_function.sh
yxb
mytest3 here
1
yxb
g_var=0
mytest4 here
g_var=

可以看到mytest3在return了以后其实没有直接返回,而是执行了循环体后的语句,同时看到mytest4中也是一样,同时,在mytest4中,对全局变量的修改也无济于事,全局变量的值根本就没有改变。

这个是什么原因那?

笔者认为,之所以return语句没有直接返回,是因为return语句是在管道中执行的,管道其实是另一个子进程,而return只是从子进程中返回而已,只是while语句结束了,而函数体之后的语句会继续执行。

同理,全局变量在子进程中进行了修改,但是子进程的修改没有办法反应到父进程中,全局变量只是作为一个环境变量传入子进程,子进程修改自己的环境变量,不会影响到父进程。

因此在写shell函数的时候,用到管道的时候一定要清楚,此刻是从什么地方返回。

4、echo返回值(显式输出)

其实在shell中,函数的返回值有一个非常安全的返回方式,即通过输出到标准输出返回。因为子进程会继承父进程的标准输出,因此,子进程的输出也就直接反应到父进程。因此不存在上面提到的由于管道导致返回值失效的情况。

在外边只需要获取函数的返回值即可。

 代码如下

复制代码

本文由威尼斯wns.9778官网活动发布于计算机教程,转载请注明出处:shell 使用数组作为函数参数的方法(详解)

关键词: