9、Linux Shell 笔记(2),函数和数组

简介: 1、重定向很多数据,用echo就不方便了。我们用exec命令。 如exec 1>testout Shell 中最多可以有9个打开的文件描述符。 2、重定向 exec 3>&1 //脚本将文件描述符3重定向到文件 exec 3testfile //exec使命令将文件描述符3分配给文件testfile的输入输出操作 重定向到特殊符号&-来关闭文件描述符。

1、重定向很多数据,用echo就不方便了。我们用exec命令。

exec 1>testout

Shell 中最多可以有9个打开的文件描述符。

2、重定向

exec 3>&1 //脚本将文件描述符3重定向到文件

exec 3<>testfile //exec使命令将文件描述符3分配给文件testfile的输入输出操作

重定向到特殊符号&-来关闭文件描述符。

列向所有文件描述符:lsof

/dev/null

将输出同时发送到监视器和日志文件,用tee命令。

Mktemp 来创建临时文件和昨时目录。

在同一步物理介质的文件间只能创建一个硬链接。

3、函数

Function name

{

commands

}

另外一种格式:

Name(){

commands

}

函数的退出状态是函数的最后一条命令返回的退出状态。Return

函数输出

Function db

{

Read -p "Enter a value: " value

Echo $[$value * 2]

}

Result = 'db'

Echo "It's $Result"

Shell将函数作为小型脚本处理,可以像普通脚本那样给其传递参数。

默认情况下,脚本中定义的变量都是全局变量。

局部变量:local temp

数组变量和函数

Passing arrays to functions

The art of passing an array variable to a script function can be confusing. If you try to pass the array variable as a single parameter, it wont work:

$ cat badtest3

#!/bin/bash

# trying to pass an array variable

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

$ ./badtest3

The original array is: 1 2 3 4 5

The parameters are: 1

./badtest3: thisarray[*]: bad array subscript

The received array is

$

If you try using the array variable as a function parameter, the function only picks up the first value of the array variable.

To solve this problem, you must disassemble the array variable into its individual values, then use the values as function parameters. Inside the function, you can reassemble all of the parameters into a new array variable. Heres an example of doing this:

$ cat test10

#!/bin/bash

# array variable to function test

function testit {

local newarray

newarray=(`echo "$@"`)

echo "The new array value is: ${newarray[*]}"

}

myarray=(1 2 3 4 5)

echo "The original array is ${myarray[*]}"

testit ${myarray[*]}

$ ./test10

The original array is 1 2 3 4 5

The new array value is: 1 2 3 4 5

$

The script uses the $myarray variable to hold all of the individual array values to place them all on the command line for the function. The function then rebuilds the array variable from the command line parameters. Once inside the function, the array can be used just like any other array:

$ cat test11

#!/bin/bash

# adding values in an array

function addarray {

local sum=0

local newarray

newarray=(`echo "$@"`)

for value in ${newarray[*]}

do

sum=$[ $sum + $value ]

done

echo $sum

}

myarray=(1 2 3 4 5)

echo "The original array is: ${myarray[*]}"

arg1=`echo ${myarray[*]}`

result=`addarray $arg1`

echo "The result is $result"

$ ./test11

The original array is: 1 2 3 4 5

The result is 15

$

The addarray function iterates through the array values, adding them together. You can put any number of values in the myarray array variable, and the addarray function will add them.

Returning arrays from functions

Passing an array variable from a function back to the shell script uses a similar technique. The function uses an echo statement to output the individual array values in the proper order, thenthe script must reassemble them into a new array variable:

$ cat test12

#!/bin/bash

# returning an array value

function arraydblr {

local origarray

local newarray

local elements

local i

origarray=(`echo "$@"`)

newarray=(`echo "$@"`)

elements=$[ $# - 1 ]

for (( i = 0; i <= $elements; i++ ))

{

newarray[$i]=$[ ${origarray[$i]} * 2 ]

}

echo ${newarray[*]}

}

myarray=(1 2 3 4 5)

echo "The original array is: ${myarray[*]}"

arg1=`echo ${myarray[*]}`

result=(`arraydblr $arg1`)

echo "The new array is: ${result[*]}"

$ ./test12

The original array is: 1 2 3 4 5

The new array is: 2 4 6 8 10

The script passes the array value, using the $arg1 variable to the arraydblr function. The arraydblr function reassembles the array into a new array variable, and it makes a copy for the output array variable. It then iterates through the individual array variable values, doubles each value, and places it into the copy of the array variable in the function.

The arraydblr function then uses the echo statement to output the individual values of the array variable values. The script uses the output of the arraydblr function to reassemble a new array variable with the values.

参考:

1Linux命令行和SHELL脚本编程

目录
相关文章
|
7天前
|
运维 Oracle 容灾
Oracle dataguard 容灾技术实战(笔记),教你一种更清晰的Linux运维架构
Oracle dataguard 容灾技术实战(笔记),教你一种更清晰的Linux运维架构
|
7天前
|
运维 Linux Docker
Docker笔记(个人向) 简述,最新高频Linux运维面试题目分享
Docker笔记(个人向) 简述,最新高频Linux运维面试题目分享
|
2天前
|
Shell Linux 程序员
【Linux】Shell 命令以及运行原理
【Linux】Shell 命令以及运行原理
|
3天前
|
Shell Linux
【linux课设】自主实现shell命令行解释器
【linux课设】自主实现shell命令行解释器
|
3天前
|
存储 Unix Linux
linux权限管理以及shell
linux权限管理以及shell
|
4天前
|
运维 Linux Shell
day02-Linux运维-系统介绍与环境搭建_硬件 系统核心 解释器shell 外围操作系统
day02-Linux运维-系统介绍与环境搭建_硬件 系统核心 解释器shell 外围操作系统
|
5天前
|
编解码 Linux 5G
FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器
AVS3,中国制定的第三代音视频标准,是首个针对8K和5G的视频编码标准,相比AVS2和HEVC性能提升约30%。uavs3d是AVS3的解码器,支持8K/60P实时解码,且在各平台有优秀表现。要为FFmpeg集成AVS3解码器libuavs3d,需从GitHub下载最新源码,解压后配置、编译和安装。之后,重新配置FFmpeg,启用libuavs3d并编译安装,通过`ffmpeg -version`确认成功集成。
17 0
FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器
|
9天前
|
Shell Linux Perl
Linux|如何允许 awk 使用 Shell 变量
Linux|如何允许 awk 使用 Shell 变量
19 2
|
9天前
|
Linux
linux中wait与waitpid函数使用场景及扩展
linux中wait与waitpid函数使用场景及扩展
|
9天前
|
Linux
linux中fork函数与vfork函数的区别
linux中fork函数与vfork函数的区别