shell常用总结
shell作为一种脚本语言,必须有解释器来执行脚本。常见的shell脚本解释器有bash,sh,csh,ksh等。
1.基础写法
1.1.开头一般写法
#! /bin/bash
或 #!/bin/bash +x
set -e
注意 #!,指明bash。
注意 #! 是告诉系统该脚本需要用什么解释器来执行,即使用哪一种Shell。
在脚本开头加上set -e,这句语句告诉bash如果任何语句的执行结果不是true则应该退出。开发脚本过程中可以添加利于检查错误。
-e 如果一个命令以非零状态退出,则立即退出,使用 + 而不是 - 会使标志位被关闭。
备注:
在shell脚本中,注释使用#开头,注视的行会被解释器忽略。在shell中没有多行注释,只能每一行加一个#号。
1.2.定义变量
注意: 等号前后不能有空格,获取一串命令的结果用 ``。
同时,变量名的命名须遵循如下规则:
首个字符必须为字母(a-z,A-Z)。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
以下是定义变量的几种常见方式:
name=mynme 表示给name赋值
file=$1 ($1表示脚本执行的第一个参数)
basepath=$(cd `dirname $0`; pwd) 表示示获取当前正执行脚本的绝对路径
dir="$(get_dir)" 表示取get_dir函数的返回值
name=`ifconfig eth0 | grep netmask | awk '{print $2}'` 表示输出netmask所在行的第二个字段(默认空格分开),若是$0则输出整行内容。
eth=`ip link | grep " UP mode" | awk -F : '{print $2}'`
result="$(mk_resultdir $test_name)"
start_res=`systemctl status docker | awk "NR==3"{print}|awk '{print $3}'` 表示提取docker服务的运行状态,运行时输出为(runing)。
1.3.特殊变量
特殊变量:
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1 ,第二个参数是$2 。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
$* 和 $@ 的区别:
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以”$1" “
2
"
…
"
2" … "
2"…"n” 的形式输出所有参数。
但是当它们被双引号(" “)包含时,”$*" 会将所有的参数作为一个整体,以"$1 $2 …
n
"
的
形
式
输
出
所
有
参
数
;
"
n"的形式输出所有参数;"
n"的形式输出所有参数;"@" 会将各个参数分开,以"$1" “
2
"
…
"
2" … "
2"…"n” 的形式输出所有参数。
退出状态:
$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。
退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。不过,也有一些命令返回其他值,表示不同类型的错误。
1.4.echo的几种显示
echo:是Shell的一个内部指令,用于在屏幕上打印出指定的字符串。
echo “xxxxxxx”
echo "------------------------名称:$name---------------------------------------"
终端打印内容并将内容追加到文件:
echo "xxxx" | tee -a text.txt
echo -e "\033[32m 提示的内容! \033[0m" | tee -a $file 绿色字体
echo -e "\033[31m 提示的内容!\033[0m" | tee -a $file 红色字体
echo 'lll$$$lll222'
注意,echo后单引号和双引号作用是不同的。单引号不能转义里面的字符。双引号可有可无,单引号主要用在原样输出中。
颜色数字:
30:灰色 31:红色 32:绿色 33:黄色
34:蓝色 35:紫色 36:青色? 37:白色
从40开始就有以上对应的颜色加底色。
1.5.printf打印
printf:格式化输出语句。 printf 命令用于格式化输出, 是echo命令的增强版。它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同。
如同 echo 命令,printf 命令也可以输出简单的字符串:
printf "hello\n"
printf 不像 echo 那样会自动换行,必须显式添加换行符(\n)。
例子:
# 双引号
printf "%d %s\n" 10 "abc"
10 abc
# 单引号与双引号效果一样
printf '%d %s\n' 10 "abc"
10 abc
# 没有引号也可以输出
printf %s abc
abc
# 但是下面的会出错:
printf %d %s 10 abc
#因为系统分不清楚哪个是参数,这时候最好加引号了。
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
$ printf %s a b c
abc
$ printf "%s\n" a b c
a
b
c
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
$ printf "%s and %d \n"
and 0
# 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
$ printf "The first program always prints'%s,%d\n'" Hello Shell
-bash: printf: Shell: invalid number
The first program always prints 'Hello,0'
$
1.6.read命令行从输入设备读入内容
#!/bin/bash
echo "date?"
read DATE
echo "Teday is $DATE"
1.7.转义字符
常见如下:
转义字符 含义
\\ 反斜杠
\a 警报,响铃
\b 退格(删除键)
\f 换页(FF),将当前位置移到下页开头
\n 换行
\r 回车
\t 水平制表符(tab键)
\v 垂直制表符
shell默认是不转义上面的字符的。需要加-e选项。
举个例子:
#!/bin/bash
a=11echo -e "a is $a \n"
运行结果:
a is 11
如果不加-e,则打印结果为:
a is 11 \n
可以使用 echo 命令的 -E 选项禁止转义,默认也是不转义的;使用 -n 选项可以禁止插入换行符。
1.8.反引号 `` 命令替换
注意是反引号,不是单引号,这个键位于 Esc 键下方。
#!/bin/bash
DATE=`date`
echo "Date is $DATE"
1.9.变量替换
变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值。
形式 | 说明 |
---|---|
${var} | 变量本来的值 |
${var:-word} | 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。 |
${var:=word} | 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。 |
${var:?message} | 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。若此替换出现在Shell脚本中,那么脚本将停止运行。 |
${var:+word} | 如果变量 var 被定义,那么返回 word,但不改变 var 的值。 |
1.10.date时间
Date=date +%G-%m-%d-%H-%M-%S
例如:
$ date +%G-%m-%d-%H-%M-%S
2022-11-21-17-21-56 (年-月-日-时-分-秒)
1.11. awk补充用法
https://www.cnblogs.com/52fhy/p/5836429.html#autoid-3-4-0
#按行输出文本
awk {print} 3.txt
或awk '{print $0}' 3.txt
#输出第三到六行内容
awk 'NR==3,NR==6{print}' 3.txt
或awk '(NR>=3)&&(NR<=6){print}' 3.txt
#输出第三或第六行
awk 'NR==3||NR==6{print}' 3.txt
输出第三行
awk "NR==3"{print} 3.txt
注意:
'NR==3{print}' 效果和 "NR==3"{print} 效果一样
输出奇偶行 用与2取余来判断:
awk '(NR%2)==1{print}' 3.txt #输出所有奇数行的内容
awk '(NR%2)==0{print}' 3.txt #输出所有偶数行的内容
输出以xxx开头的行:
awk '/^xxx/{print}' /etc/passwd
输出以…结尾的行
awk '/xxx$/{print}' /etc/passwd
按列(字段)输出文本
awk -F ":" '{print $3}' /etc/passwd
#输出第三 第四个字段 也就是uid 和 gid
awk -F ":" '{print $3,$4}' /etc/passwd
#输出 第三个字段<8的 第三和第四个字段
awk -F ":" '$3<8{print $3,$4}' /etc/passwd
#输出 第三个字段不<8的 第三和第四个字段
awk -F ":" '!($3<8){print $3,$4}' /etc/passwd
#输出以冒号分隔且第7个字段中包含/bash的行的第1个字段
awk -F ":" '$7~"/bash"{print $1}' /etc/passwd
#统计 以冒号分隔的字段 调用wc -l 统计数量
awk -F ":" '{print | "wc -l"}' /etc/passwd
ping=`ping -c 3 $ip|awk 'NR==7 {print $4}'`
1.12.字符串
单双引号的区别:
双引号里可以有变量,单引号则原样输出;
双引号里可以出现转义字符,单引号则原样输出;
单引号字串中不能出现单引号。
1.12.1.拼接字符串
str1='i'
str2='love'
echo $str1 $str2 输出:i love
echo $str1$str2 输出:ilove
echo $str1,$str2 输出:i,love
1.12.2.获取字符串长度
str='i love you'
echo ${#str} 输出:10
1.12.3.截取字符串
str='i love you'
echo ${str:1} # 从第1个截取到末尾。注意从0开始。输出:love you
echo ${str:2:2} # 从第2个截取2个。 输出:lo
echo ${str:0} # 全部截取。 输出:i love you
echo ${str:-3} # 负数无效,视为0。 输出:i love you
1.12.4.查找字符串
str="i love you"
echo `expr index "$str" l` 输出:3
echo `expr index "$str" you` #最后一个参数是字符,会对后面字符串每一个单独查找,返回最靠前的index 输出:4
echo `expr index "$str" o` 输出:4
echo `expr length "$str"` #字符串长度 输出:10
echo `expr substr "$str" 1 6` #从字符串中位置1开始截取6个字符。索引是从0开始的。 输出:i love
注意字符串变量需要加双引号。第2个例子里you虽然y的index是8,但是o在前面已经出现过,index是4,最终取所有字符里最靠前的index。
1.13.数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
在Shell中,用括号来表示数组,数组元素用空格符号分割开。定义数组的一般形式为:
array_name=(value1 value2 ... valuen)
如:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
可以不使用连续的下标,而且下标的范围没有限制。
下面来读取数组:
echo ${array_name[2]} #读取下标为2的元素
echo ${array_name[*]} #读取所有元素
echo ${array_name[@]} #读取所有元素
echo ${#array_name[*]} #获取数组长度
echo ${#array_name[@]} #获取数组长度
echo ${#array_name[1]} #获取数组中单个元素的长度
1.13.1.字符串和数组总结
对比shell里字符串和数组,我们发现:
字符串
str="hello"${#str} # 读取字符串长度
echo ${str} # 读取字符串全部echo ${str:1} # 截取字符串
数组:
arr=(a1 a2 a3)
echo ${#arr[*]} # 读取数组长度
echo ${#arr[1]} # 读取数组某个元素长度
echo ${arr[*]} # 读取数组全部
echo ${arr[1]} # 读取数组某个元素
${#ele*}用来读取ele元素长度属性
${ele*}用来读取或操作ele元素
1.13.2.注意 “” 和 `` 和 ‘’ 的区别
变量的引用主要包含四类:
双引号引用、单引号引用、反引号引用、反斜线引用
" " 双引号 屏蔽除美元符号$、反引号( ` )和反斜线( \ )之外的所有字符
' ' 单引号 屏蔽所有的字符
`` 反引号 shell将反引号中的内容解释为系统命令
\ 反斜线 转义符,屏蔽下一个字符的特殊含义
shell变量的引用指的是 用引用符号将字符串引起来,从而屏蔽特殊字符被shell解释为其他含义。比如通配符星号(*)表示匹配任意字符串,如果引号引起来则只表示星号
' ': 大笨蛋,你给他什么他就显示什么,不动脑子
"" : 勉强吧,至少他还知道$后面跟的是变量,明白,但是不回去做(不去执行命令)
` `: 牛逼啊,他不仅能够识别变量,还知道你想做什么(可以执行命令)
已定义的变量,可以被重新定义。
在变量前面加readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
url="http://www.baidu.com"readonly url
url="http://www.baidu.com"
使用 unset 命令可以删除变量。语法:
unset variable_name
变量被删除后不能再次使用;unset 命令不能删除只读变量。
1.14.运算符
1.14.1.算术运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具
使用表达式
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
乘号(*)前边必须加反斜杠()才能实现乘法运算
完整的表达式要被
包含,注意这个字符不是常用的单引号,在 Esc 键下边。
算术运算符列表
运算符 说明 举例
+ 加法 `expr $a + $b` 结果为 30。
- 减法 `expr $a - $b` 结果为 10。
* 乘法 `expr $a \* $b` 结果为 200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等 用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等 用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。
1.14.2.关系运算符
关系运算符列表
运算符 说明
-eq 检测两个数是否相等,相等返回 true。同算数运算符`==`
-ne 检测两个数是否相等,不相等返回 true
-gt 检测左边的数是否大于右边的,如果是,则返回 true。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
-ge 检测左边的数是否大等于右边的,如果是,则返回 true。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。
例如:if [ $a -eq $b ]
1.14.3.布尔运算符
布尔运算符列表
运算符 说明
! 非运算,表达式为 true 则返回 false,否则返回 true。
-o 或运算(or),有一个表达式为 true 则返回 true。
-a 与运算(and),两个表达式都为 true 才返回 true。
例如:
if [ 3 -eq 3 -a 3 -lt 5 ]
then
echo 'ok'
fi;
1.14.4.字符串运算符
字符串运算符列表
运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -n $a ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
1.14.5.文件测试运算符
操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是具名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
1.15.休眠
直接执行sleep命令
sleep 20s
1.16.断言 assert
assert $? 0 “xx服务关闭”
1.17.函数定义
fork_list=(run stop)
run()
{
if [[ $os =~ "xxx" ]];then
rtstat|tee -a $log
else
rtstat|tee -a $log
fi
}
stop()
{
sleep 10s
ps aux | grep -w "rtstat" |grep -v grep|grep -v "rtstat.sh"| cut -c 9-15 | xargs kill -9
}
function clean_srpm(){
for srpm in `ls SRPMS`
do
rm -rf ll/$srpm
done
}
1.18.其它
gcc -mmsa dummy.c > /dev/null 2>&1
全部可用的重定向命令列表:
命令 说明
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 之间的内容作为输入。
1.19.EOF写入文件
将内容写入test.sh文件:
cat >test.sh <<EOF
文件内容
EOF
通过 wc -l 命令计算 document 的行数:
wc -l << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
1.20./dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到禁止输出的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
command > /dev/null 2>&1
补充:
rpm -qpR ./xxx.rpm 2>/dev/null
数字2: 表示错误信息
数字1:表示正确信息
1.21.定义字符串
serverdoamin=“hhhhhh”
2.条件控制
2.1.条件判断:if语句
if [ expression ]
then
Statement(s) to be executed if expression is true
fi
注意:expression 和方括号([ ])之间必须有空格。
Shell 有三种 if … else 语句:
if ... fi 语句
if ... else ... fi 语句
if ... elif ... else ... fi 语句
2.1.1.常见几种结构
第一种:
if [ $exitd -ne 0 ];then
exit 1
else
upload $test_name $ip
fi
第二种:
if [ uname -r|grep 4.19 ];then
第三种:
if [[ $? -eq 0 ]] && [[ `cat $log|wc -l` -eq 4 ]];then
第四种:
if [ $? -eq 0 ];then
第五种:
if [ -z "`dpkg -l | grep sshpass`" ];then
if [ ! -z "`rpm -qa | grep docker`" ] ;then
if [ ! -d $source_path ];then
if [[ ! -n "$(cat /etc/apt/sources.list|grep ^deb-src)" ]];then
if [[ $(ls -l $source_path|wc -l) -lt 3 ]];then
if [ -f "/home/openssl-*.rpm" ];then
if [ ! -r $result ];then
if [ ! -e a.out ] ;then
for i in $(ifconfig | grep flags | grep -E ^enp | cut -d ":" -f 1)
# 括号里和ifconfig | grep flags | grep -E ^enp | awk -F ":" '{print $1}' 结果一样。
if [[ ! -x "$(command -v docker)" ]];then
command -v docker的效果和 which docker 一样。
if [[ $1 != *[^0-9]* ]]&&[[ $a != 0* ]];then
2.2.分支控制:case语句
case … esac 与其他语言中的 switch … case 语句类似,是一种多分枝选择结构。
#!/bin/bash/
grade="B"
case $grade in
"A") echo "Very Good!";;
"B") echo "Good!";;
"C") echo "Come On!";;
*)
echo "You Must Try!"
echo "Sorry!";;
esac
或者下边写法:
case $opt in
"1111")
build_1
;;
"2222")
for i in {1..10}
do
build_2
done
;;
*)
echo "xxxxx"
;;
esac
2.3.for循环
2.3.1.格式和例子
for 变量 in 列表
do
command1
command2
...
commandN
done
第一个例子:
for value in 1 2 3 4 5
do
echo "The value is $value"
done
第二个例子:
for str in 'This is a string'
do
echo $str
done
第3个例子:遍历目录下的文件
citys=`cat city.txt`
for city in $citys
do
echo $city
done
2.3.2.for几种常见写法
第一种:
for ((i=1; i<=2; i++)) (执行do-done中两次)
do
xxxxx
done
第二种:
for fork in ${fork_list[*]};do
read -u1000
{
$fork
echo >&1000
} &
done
第三种:
for i in {1..100}
do
build_1
build_2
# createrepo
done
2.4.while循环
只要while后面的条件满足,就一直执行do里面的代码块。
while command
do
Statement(s) to be executed if command is true
done
例子:
c=0;
while [ $c -lt 3 ]
do
echo "Value c is $c"
c=`expr $c + 1`
done
2.5.until循环
until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until 循环更加有用。
c=0;
until [ $c -eq 3 ]
do
echo "Value c is $c"
c=`expr $c + 1`
done
2.6.跳出循环
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 break 和 continue 来跳出循环。
2.6.1.break
break命令允许跳出所有循环(终止执行后面的所有循环)。
例子:
i=0
while [ $i -lt 5 ]
do
i=`expr $i + 1`
if [ $i == 3 ]
then
break
fi
echo -e $i
done
在嵌套循环中,break 命令后面还可以跟一个整数,表示跳出第几层循环。例如:
break n
表示跳出第 n 层循环。
2.7.continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
例子:
i=0
while [ $i -lt 5 ]
do
i=`expr $i + 1`
if [ $i == 3 ]
then
continue
fi
echo -e $i
done
3.函数
函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。Shell 函数必须先定义后使用。
格式:
function function_name () {
list of commands
[ return value ]
}
其中function关键字是可选的。
例子:
hello(){
echo 'hello world';
}
hello
调用函数只需要给出函数名,不需要加括号。
像删除变量一样,删除函数也可以使用 unset 命令,不过要加上 .f 选项,如下所示:
$unset .f function_name
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…这就是前面讲的特殊变量。
例子:
function sum(){
case $# in
0) echo "no param";;
1) echo $1;;
2) echo `expr $1 + $2`;;
3) echo `expr $1 + $2 + $3`;;
*) echo "$# params! It's too much!";;
esac
}
sum 1 3 5 6
注意,
10
不
能
获
取
第
十
个
参
数
,
获
取
第
十
个
参
数
需
要
10 不能获取第十个参数,获取第十个参数需要
10不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。
另外,还有几个特殊变量用来处理参数,前面已经提到:
特殊变量 说明
$# 传递给函数的参数个数。
$* 显示所有传递给函数的参数。
$@ 与$*相同,但是略有区别,请查看Shell特殊变量。
$? 函数的返回值。
如何获取函数返回值?
例子:
function sum()
{
echo `expr 1+2+3`
}
num=$(sum)
使用num=$(sum),这样就可以取到返回值了!
3.1.获取当前正在执行脚本的绝对路径
正确的命令是:
basepath=$(cd `dirname $0`; pwd)
直接使用pwd或者dirname $0是不对的。