脚本传参
使用$0代表脚本的相对路径
#!/bin/bash
filename=$(basename $0)
echo $filename
echo $0
echo $1
echo $2
echo $3
给脚本赋值:
./14.sh 7 10 9
其中14.sh是脚本的名称,7,10,9分别给变量1,2,3赋值,执行后的输出结果为:
14.sh
./14.sh
7
10
9
使用@来遍历所有参数:
#!/bin/bash
filename=$(basename $0)
echo $filename
echo $0
echo $1
echo $2
echo $3
echo "参数的总数:$#"
for param in "$@";
do
echo "param:$param"
done
给脚本赋值:
./14.sh 7 10 9
执行后的输出结果为:
14.sh
./14.sh
7
10
9
参数的总数:3
param:7
param:10
param:9
输入输出重定向
标准输入输出:
0 STDIN 标准输入
1 STDOUT 标准输出
2 STDERR 标准错误
1.如下,默认是输出到控制台:
#!/bin/bash
echo "yy"
echo "zz"
要将上述输出到test文件中,可以在控制台输入:
./15.sh 1>test
这样就可以将输出重定向到test文件中,我们可以验证一下,控制台输入:
cat test
可以看见test中:
yy
zz
这表示已经将输出重定向到test文件中了,但是这样并不够,我们想要在shell脚本中,将每个输出都重定向到一个文件中,显然在控制台输入这样的命令是不够的,我们需要统一处理:
#!/bin/bash
exec 1>test2
echo "yy"
echo "zz"
其中exec 1>test2就是做这样的处理的,将脚本中所有的输出重定向到test2文件中,在控制台输入./15.sh
,即可实现重定向,我们可以同上验证。
2.将标准错误输出到文件中:
#!/bin/bash
exec 1> test3
exec 2> test4
echo "yy"
echo "zz"
ls -a "./f"
这里没有f文件,所以ls -a "./f"
将会报错,这里将报错的内容都重定向到test4文件中。
3.自定义输出:
#!/bin/bash
exec 1> test3
exec 2> test4
exec 7> test5
echo "yy" >&7
echo "zz"
ls -a "./f"
这里就将yy
自定义输出到test5文件中,注意>&7
之间不能有空格,自定义输出一般用的很好,做为了解就行。
函数调用
#!/bin/bash
#第一种方式
function myfun
{
echo "myfun函数"
}
#第二种方式
myfun()
{
echo "myfun2函数"
}
myfun
上述存在两种方式,分别是用function标注和用()去表示函数myfun,两种方式都可以,一般我会用第一种方式。这里存在函数覆盖的,第二种方式的写在第一种方式的下面,会覆盖第一种方式。而第一种方式的写法又有多种,如:
function myfun {
echo "myfun函数"
}
这里myfun
与{
之间存在空格,否则会报错,还可以这样写:
function myfun(){
echo "myfun函数"
}
函数传参、返回值
#!/bin/bash
function myfun
{
echo $[ $1 + $2 ]
}
value=$(myfun 8 5)
echo "value:$value"
执行结果为:
value:13
跨脚本调用
被调用的函数库脚本18.sh
#!/bin/bash
#函数库
function add()
{
echo $[ $1 + $2 ]
}
调用18.sh的脚本17.sh
#!/bin/bash
#引入 ./18.sh
#source ./18.sh
. ./18.sh
function myfun(){
echo $value
}
value=20
myfun
echo "add value:$(add 10 20)"
其中.
就是source的快捷别名。