函数
function xxxxx()
{
xxxxx
return int
}
- 1、可以 function xxxxx() ,也可以直接 xxxxx()
- 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
fun()
{
echo 'expr 1 + 1'
}
fun #输出结果:2
echo "$?" #输出结果:0 #如果函数没有return, $? 则返回最后一条执行指令的结果
# $? =0 表示函数中最后一条指令正确
fun()
{
echo 'input one number'
read aaa #读取输入字符
read bbb #读取输入字符
echo $(($aaa+$bbb)) #输出相加结果
return $(($aaa+$bbb))
}
fun #运行函数,不加括号
echo "return : $?" #函数返回值在调用该函数后通过 $? 读取
#须立即读取,不读取,会丢失
#运行结果: input one number
5 #手动输入
6 #手动输入
11
return :11
函数参数
调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数,当n>=10时,需要使用${n}来获取参数。
fun(){
echo "第二个参数为 $2"
echo "第十个参数为 $10"
echo "第十个参数为 ${10}"
echo "参数总数有 $# 个"
echo "所有参数 $*"
}
fun 1 2 3 4 5 6 7 8 9 34 73
结果:
第二个参数为 2
第十个参数为 10
第十个参数为 34
参数总数有 11 个
所有参数 1 2 3 4 5 6 7 8 9 34 73
参数处理 | 说明 |
---|---|
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
输入/输出重定向
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
echo 'aaabbb' > a.sh #将 aaabbb 写入a.sh,如果没有a.sh,则创建,如果有,则替换掉
date > a.sh #将日期写入a.sh,并替换掉旧的a.sh
cat a.sh #结果:Thu 06 Jul 2023 02:43:44 AM UTC
echo 'aaabbb' > b.sh
date >> b.sh #将日期写入b.sh,如果没有b.sh,则创建,如果有,则在最后一行添加日期
cat b.sh #结果:aaabbb
Thu 06 Jul 2023 02:43:44 AM UTC
wc -l b.sh #结果:2 b.sh #从整个文件层面,查看b.sh 有几行代码
wc -l < b.sh #结果:2 #从标准输入读取b.sh有几行代码
make 2>err.txt #将编译错误的写入err.txt
make >err.txt 2>&1 #将 stdout 和 stderr 合并后重定向到 err.txt
/dev/null 文件(禁止输入/输出)
执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null
make> /dev/null #编译不会输出中间文件
#/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃; /dev/null 文件非常有
#用,将命令的输出重定向到它,会起到"禁止输出"的效果。
make> /dev/null 2>&1 #屏蔽 stdout 和 stderr
文件包含
. filename # 注意点号(.)和文件名中间有一空格 或 source filename
#使用 . 号来引用test1.sh 文件#注意点号(.)和文件名中间有一空格
. ./test1.sh
# 或者使用以下包含文件代码
source ./test1.sh
常用接口
echo命令
echo "\"It is a test\"" #结果:"It is a test"
echo "It is a test" > myfile #显示结果定向至文件
echo `date` #Thu Jul 24 10:08:46 CST 2014 显示命令执行结果 `是反引号
printf 命令
和echo区别:echo 自动添加换行符,printf 手动添加 \n
序列 | 说明 |
---|---|
\a | 警告字符,通常为ASCII的BEL字符 |
\b | 后退 |
\c | 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 |
\f | 换页(formfeed) |
\n | 换行 |
\r | 回车(Carriage return) |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 一个字面上的反斜杠字符 |
\ddd | 表示1到3位数八进制值的字符。仅在格式字符串中有效 |
\0ddd | 表示1到3位的八进制值字符 |
printf "%s\n" "abc"
printf "%s\n" abc def #格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf "%s %s %s\n" a b c d e f g h i j
#结果:a b c
d e f
g h i
j