shell常用总结

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是不对的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值