Xshell常用命令:
1、更改账号密码(passwd)
2、联机帮助(man)
#man [选项] [节号] 命令/主题
##---选项---
# -f:显示与指定关键字吸纳管的手册页面
# -k:搜索手册页中与关键字匹配的条目
# -a:显示所有匹配的手册页面
# -w:仅显示手册页的位置,而不显示其内容
##---节号---
#1、用户命令;2、系统调用;3、c库函数;4、设备和特殊文件
#5、文件格式和约定;6、游戏与演示;7、杂项;8、系统管理命令
#查看ls命令的手册页面
man ls
#要查看c语言标准库函数printf的手册页面
man 3 printf
#要搜索包含特定关键字的收测页面条目,可以使用 -k 选项
man -k kerword
3、远程登录(rlogin/telnet);
#rlogin 主机名 [-I 用户名]
rlogin aa #远程登录到工作站aa中;
rlogin aa -I user #使用user账号 远程登录到工作站aa中;
#telnet 主机名 或者 telnet IP地址
telnet aa #远程登录到工作站aa中;
telnet 130.129.21.250 #远程登录到IP地址位130.129.21.250的网站中
4、文件或目录处理(ls):
ls [-atFlgR] [name]
ls #列出当前目录下的文件名;
ls -a #列出包括以. 开始的隐藏文件的所有的文件名;
ls -t #按照文件最后修改时间的顺序列出文件名
ls -F #列出目录下文件名以及文件类型。
#以/结尾是目录名,
#以*结尾表示可执行文件,
#以@结尾表示为符号连接
ls -I #列出目录下所有文件的权限、所有者、文件大小、修改时间、名称
ls -lg #同上,同时显示文件所有者工作组名
ls -R #显示目录下以及其所有子目录的文件名
5、改变工作目录(cd):
cd [name]
cd dir #改变目录到dir目录下
cd user #改变目录位置至用户的工作目录
cd .. #改变目录位置至当前目录的父目录
cd ../user #改变目录位置至相对路径的user的目录下
cd /../.. #改变目录至绝对路径的目录位置下
6、复制文件(cp):
cp [options] source destination
#[options]
# -a:通常在复制目录时使用,它包保留链接,文件属性,并赋值目录下的所有内容
# -d:复制时保留链接
# -r:用于复制目录及其所有的子目录和文件
# -i:复制前给出提示,如果目标已存在,询问是否覆盖
# -u:仅复制源文件中更新时间较新的文件
# -v:显示详细的复制过程
# -p:保留源文件的权限、所有者和时间戳信息
# -f:强制复制,即使目标文件已存在也会覆盖,且无提示信息
# -l:不复制文件,只生成链接文件
cp [-r] 源地址 目的地址
cp file1 file2 #将文件 file1 复制成 f i l e 2。
cp file1 dir1 #将文件 file1 复制到目录 dir1 下,文件名仍为 f i l e 1。
cp /tmp/file1 . #将目录 /tmp 下的文件 file1 复制到当前目录下,文件名仍为 f i l e 1。
cp /tmp/file1 file2 #将目录 /tmp 下的文件 file1 复制到当前目录下,文件名为f i l e 2。
cp -r dir1 dir2 #复制整个目录。
7、移动或更改文件、目录名称(mv):
# mv 源地址 目的地址
# mv [option] [-T] source destination
# mv [option] source destination
# mv [option] -t destination source
#option
# -f:强制移动,如果目标已存在,不会询问,直接覆盖
# -i:若目标已存在,会发提示信息,询问是否覆盖
# -n:不覆盖已存在的文件
# -t:指定mv的目标的目标目录
# -u:若目标文件已经存在,且source比较新时,才updata
mv file1 file2 #将文件 f i l e 1更名为 f i l e 2。
mv file1 dir1 #将文件 f i l e 1移到目录 dir1 下,文件名仍为 f i l e 1。
mv dir1 dir2 #将目录 dir1 更改为目录 d i r 2。
mv -i file1 file2 #将文件 f i l e 1更名为 f i l e 2,如果file2存在,询问是否覆盖
8、建立新目录(mkdir):
mkdir 目录名
9、删除目录/文件(rmdir/rm):
rm dir
rm 目录名
rm 文件名
rmdir dir1 #删除目录 d i r 1,但 dir1 下必须没有文件存在,否则无法删除
rm -r dir1 #删除目录 d i r 1及其子目录下所有文件。
rm file1 #删除文件名为 file1 的文件。
rm file? #删除文件名中有五个字符且前四个字符为file 的所有文件。
rm f* #删除文件名中以 f 为字首的所有文件。
10、列出当前所在的目录位置(pwd):pwd
11、查看文件内容(cat):cat 文件名
cat file1 以连续显示方式,查看文件名 file1 的内容
12、分页查看文件内容:more 文件名、cat 文件名 | more
more file1 以分页方式查看文件名 file1 的内容。
cat file1 | more 以分页方式查看文件名 file1 的内容。
13、查看目录所占的磁盘容量(du):
du [-s] 目录
du dir1 #显示目录 dir1 的总容量及其子目录的容量(以KB 为单位)。
du -s dir1 #显示目录 dir1 的总容量。
14、文件传输
>>>拷贝文件或目录至远程工作站:
scp [-r] 源地址 主机名:目的地址
scp file1 doc:/home/user #将文件f i l e 1拷贝到工作站 doc 路径 /home/user 下。
scp -r dir1 doc:/home/user #将目录 d i r 1拷贝到工作站 doc 路径/home/user 下。
>>>自远程工作站,拷贝文件或目录(rcp):
scp [-r] 主机名:源地址 目的地址
scp doc:/home/user/file1 file2 #将工作站 d o c路径/home/user 下的文件file1,拷贝到当前工作
#站的目录下文件名为file2。
scp -r doc:/home/user/dir1 . #将工作站doc 路径/home/user 下的目录 d i r 1,拷贝到当前工
#作站的目录下,目录名仍为 d i r 1。
>>>本地工作站与远程工作站之间的文件传输(ftp):
ftp 主机名 或 ftp ip地址
ftp> help #列出 ftp 文件传输时可使用的命令。
ftp> !ls #列出本地工作站当前目录下的所有文件名。
ftp> !pwd #列出本地工作站当前所在的目录位置。
ftp> ls #列出远程工作站当前目录下的所有文件名。
ftp> dir #列出远程工作站当前目录下的所有文件名。
ftp> dir . |more #分页列出远程工作站当前目录下的所有文件名。
ftp> pwd #列出远程工作站当前所在的目录位置。
ftp> cd dir1 #更改远程工作站的工作目录位置至 dir1 之下。
ftp> get file1 #将远程工作站的文件 f i l e 1拷贝到本地工作站中。
ftp> put file2 #将本地工作站的文件 f i l e 2拷贝到远程工作站中。
ftp> mget *.c #将远程工作站中扩展文件名为 c 的所有文件拷贝到本地工作站中。
ftp> mput *.txt #将本地工作站中扩展文件名为 txt 的所有文件拷贝到远程工作站中。
ftp> prompt #切换交互式指令(使用 mput/mget 时不是每个文件皆询问y e s / n o )。
ftp> quit #结束 ftp 工作。
ftp> bye #结束 ftp 工作。
15、文件权限设定(chmod):
>>>改变文件或目录的读、写、执行权限: chmod [-R] mode name
#mode: 3个8位数字或r w x的组合。
#r--------------------- r e a d (读)
#w ------------------- w r i t e (写)
#x -------------------- e x e c u t e (执行)
#u -------------------- u s e r (当前用户)
#g -------------------- g r o u p(组)
#o -------------------- o t h e r(其他用户)
chmod 755 dir1 #对于目录d i r 1,设定成任何使用者皆有读取及执行的权利,但只有所有者可做修改
chmod 700 file1 #对于文件f i l e 1,设定只有所有者可以读、写和执行的权利
chmod u+x file2 #对于文件f i l e 2,增加当前用户可以执行的权利。
chmod g+x file3 #对于文件f i l e 3,增加工作组使用者可执行的权利。
chmod o-r file4 #对于文件f i l e 4,删除其他使用者可读取的权利。
>>>改变文件或目录的所有权:chown [-R] 用户名 name
chown user file1 #将文件 file1 改为用户user 所有。
chown -R user dir1 #将目录 d i r 1及其子目录下面的所有文件改为用户user 所有。
16、检查自己所属的工作组名称:g r o u p s
17、改变文件或目录工作组所有权:
chgrp [-R] 工作组名 name
#n a m e:文件名或目录名
chgrp vlsi file1 #将文件 file1 的工作组所有权改为 vlsi 工作组所有。
chgrp -R image dir1 #将目录d i r 1及其子目录下面的所有文件,改为 image 工作组所有
18、改变文件或目录的最后修改时间:touch name;name:文件名或目录名
19、文件的链接:ln 老文件名 新文件名
20、文件中字符串的查寻:
grep string file
grep abc file1 #寻找文件f i l e 1中包含字符串 abc 所在行的文本内容。
21、查寻文件或命令的路径
whereis command #显示命令的路径
which command #显示命令的路径,及使用者所定义的别名。
whatis command #显示命令功能的摘要。
find search-path -name filename -print #搜寻指定路径下某文件的路径 。
22、比较文件或目录的内容:
diff [-r] name1 name2
#name1 name2:可同时为文件名或目录名。
diff file1 file2 #比较文件file1 与 file2 内各行的不同之处。
diff -r dir1 dir2 #比较目录 dir1 与 dir2 内各文件的不同之处。
23、文件打印输出
#用户可用 .login 文件中的 setenv PRINTER来设定打印机名。
#例如 :
setenv PRINTER sp #设定自 sp 打印机打印资料。
#>>>一般文件打印:lpr [-P打印机名] 文件名
lpr file1
lpr -Psp file1 #自 s p打印机打印文件 f i l e 1。
#>>>enscript [-P打印机名] 文件名
enscript file3
enscript -Psp file3 #自 s p打印机打印文件 f i l e 3。
24、troff 文件的打印:ptroff [-P打印机名] [-man][-ms] 文件名
ptroff -Psp -man /usr/man/man1/lpr1 #以troff 格式,自 sp 打印机打印lpr1 命令的使用说明
25、查看系统进程:ps [-aux]
ps
ps -x #查看系统中属于自己的进程
ps -au #查看系统中,所有用户的进程。
ps -aux #查看系统中,包含系统内部的及所有用户的进程。
26、结束或终止进程:kill
语法:kill [-9] PID
#PID:利用 ps 命令所查出的进程号。
27、在后台执行的进程:&
cc file1.c & #将编译 file1.c 文件的工作置于后台执行。
#语法:按下 Ctrl + Z键,暂停正在执行的进程。键入bg命令,将暂停的进程置于后台继续执行
28、查看正在后台中执行的进程:jobs
29、结束或终止后台中的进程:kill %n;n:利用jobs命令查看出的后台作业号
kill % #终止在后台中的第一个进程。
kill %2 #终止在后台中的第二个进程。
30、查看shell变量的设定值
语法:set 查看所有shell变量的设定值。
语法:echo $变量名 显示指定的shell变量的设定值。
31、查看所定义的命令的别名:alias
语法: alias name 查看指定的name 命令的别名。
32、定义命令的别名
语法: alias name‘command line’
33、删除所定义的别名
#语法: unalias name
unalias dir #删除别名 dir 的定义。
unalias * #删除所有别名的设定。
34、查找历史命令
>>>设定命令记录表的长度:语法: set history = n
>>>查看命令记录表的内容:语法:history
>>>使用命令记录表:语法: !! 重复执行前一个命令。语法: ! n---》n:命令记录表的命令编号。
语法: ! s t r i n g 重复前面执行过的以 string 为起始字符串的命令。
例如: ! c a t 重复前面执行过的以 cat 为起始字符串的命令。
>>>显示前一个命令的内容。语法: ! !:p
>>>更改前一个命令的内容并执行。语法: ^oldstring ^newstring 将前一个命令中 oldstring 的部份改成 n e w s t r i n g并执行。
例如:
find . -name file1.c -print
^ f i l e 1 . c ^ c o r e
find . -name core -print
35、文件压缩
语法:compress 文件名 压缩文件
语法:compressdir 目录名 压缩目录
语法:uncompress 文件名 解压缩文件
语法:uncompressdir 目录名 解压缩目录
36、管道命令的使用
语法:命令1 | 命令2 将命令1的执行结果送到命令2,做为命令2的输入。
例如:
ls -Rl | more 以分页方式列出当前目录及其子目录下所有文件的名称。
cat file1 | more 以分页方式列出文件 file1 的内容。
37、查看系统中的用户
语法: who 或 f i n g e r
语法: w
语法: finger 用户名 或 finger 用户名@域名
38、改变用户名
语法: su 用户名
39、查看用户名
语法: who am i 查看登录时的用户名。若已执行过s u命令,则显示出此用户的用户名。
40、查看当前系统上所有工作站的用户
语法: rusers
按Ctrl+C> 结束
Xshell脚本
vim /etc/passwd
##---------shell脚本编写原则:
#1、编写shell脚本;2、赋予可执行权限;3、执行、调试
#!/bin/bash #用于标示这个脚本使用的shell版本
echo "hello wrld" #脚本的内容,到这里脚本完成初步编写,echo关键字含义目前不清楚
#执行
chmod a+x hello.sh #chmod +x 文件名加后缀---意思是编程可执行文件
hello.sh //回车,执行
##-----------shell关键字小汇总
#<感觉都是用于编写脚本>
#常用的:<下面用例子佐证具体用法>
echo:打印文字到屏幕
exec:执行另一个shell脚本
read:读标准输入
expr:对整数型变量进行算术运算
test:用于测试变量是否相等,是否为空,文件类型等
exit:退出
#----示例----
#!/bin/bash
echo "hello shell"
read VAR #<读入变量,>
echo "VAR is $VAR"
expr $VAR -5 #<变量计算,做减法>
test "hello"="hellworld" #<测试字符串是否相等>
test $VAR - eq 10 #<测试整数是否相等>
test -d ./Android #<测试目录>
exec ./othershell.sh #<执行其其他shell脚本>
exit #<退出>
##----shell变量定义:用户自定义/预定义/环境变量
#定义变量时:等号前后不要有空格/变量名大写/使用$VAR调用变量
#用户自定义变量:仅支持字符串类型;常见的三个前缀:unset(删除变量);
# readonly(标记只读变量);export(指定全局变量)
#----<示例>----
#!/bin/bash
CLY=SHI
export NAME=idhf
readonly AGR=21
echo $CLY
echo $NAME
echo $AGR
unset CLY
echo $CLY
#--结果是
idhf
##<<<变量定义时不能有空格,要整体输入,如果想有空格,那就用单引号或者双引号括起来
##单引号和双引号的区别在于
a="hello"
b="$a word"
echo $b
#输出:hello word ---->双引号中的$a会被替换成变量值;如果b='$a word",会打印输出:$a word
#------>单引号中的$a保持原样输出
#<<<特别的符号:``(UVM中宏的定义符号`UVM);在该符号中的命令会被执行
d=`date`
echo $d
#输出:具体的日期信息;可以用$()替代` `
e=$(date)
echo $e
#输出:同上
<<<<命令行交互read
read [-pt] variable #参数p:后面可接提示符;参数t:后面可接秒数
#---示例
read -p "please input your name:" 变量名
read -p "please input your name:" -t 5 变量名
<<<<定义变量类型declare
declare [-aixr] variablr
a:将variable定义为数组
i:将variable定义成整型
x:将variable设置成环境变量,类似于export
r:variable为readonly类型,数值不能被更改
#---<示例>
#如果我们想输出一个求和后的值:
sum=100+300+500
echo $sum
#输出:100+300+500,发现他只输出表达式(其实是被当作字符串类型数据输出了),
#如果想输出求和后的值,用declare定义变量类型
declare -i sum=100+300+500
echo $sum
#输出:900
4、shell中的集合类型
#数组(array):元素用括号包围,各元素之间空格隔开/打印数组时,${数组名或者数组名[]}//打印时[]中出#现”*“、”@“时,是打印整个数组的
#---示例:
array_name=(v0 v1 v2 v3)
array_name[2]=v22
echo ${array_name[2]}
echo ${array_name[*]}
echo ${array_name[@]}
echo ${#array_name[@]}//数组长度
echo ${#array_name[2]}//数组中[2]元素长度
#---输出:
v22
v0 v1 v22 v3
v0 v1 v22 v3
4
4
3
##----地图(map):存的都是键值对
#map变量定义:
declare -A m=(["a"]="1" ["b"]="2")
#输出所有的key
echo ${!m[@]}
#输出:a b
#输出所有的value
echo ${m[@]}
#输出:1 2
#输出指定key对应的value
echo ${m["a"]}
#输出:1
echo ${m["b"]}
#输出:2
#统计map中键值对的个数
echo ${#m[@]}
2
>>>>预定义变量:常用来获取命令的输入
$0:脚本文件名
$1-9:第1-9个命令行参数名
$#:命令行参数个数
$@:所有命令行参数
$*:所有命令行参数
$?:前一个命令的退出状态
$$:执行的进程ID
>>>>>环境变量:默认存在。常用的:HOME:用户主目录;PATH:系统环境变量PATH;TERM:当前终端;UID:当前用户;PWD:当前工作目录,绝对路径
5、shell中的字符操作
str="dfisliopw"
#<字符串删除
echo ${str#---(要删除的内容,从字符串最前面开始)-----} # #表示从前往后截取
echo ${str%---(要删除的内容,从字符串最后面开始)----} # %表示从后往前截取
#一个#或者%:表示将符合的最短数据删除;如果同时使用##或%%:表示将符合的最长的数据删除
#<字符串截取:从指定位置截取,可以指定截取位数
echo ${str:2} #从第2位开始一直截取到末尾,第一个字符下标是0
echo ${str:2:3} #从第二位开始顺序截取三个字符
echo ${str:(-6):3} #从倒数第六位开始,截取三个字符,最后一个字符下标是-1
<字符串替换
使用(/)表示只替换第一个遇到的字符
使用(//)表示替换全部符号的字符
使用(#)匹配以指定字符开头的字符串
使用(%)匹配以指定字符开头的字符串
[root@localhost ~]:~$ echo ${str/e/E}
https://www.zhihu.com/pEople/4k8k
[root@localhost ~]:~$ echo ${str//e/E}
https://www.zhihu.com/pEoplE/4k8k
[root@localhost ~]:~$ echo ${str/#h/H} # 匹配开头的那个h
Https://www.zhihu.com/people/4k8k
[root@localhost ~]:~$ echo ${str/e/E}
https://www.zhihu.com/pEople/4k8k
[root@localhost ~]:~$ echo ${str/%e/E} # 匹配最后那个E,前一个匹配中匹配的是people中的e
https://www.zhihu.com/peoplE/4k8k
>字符串默认值"-default":如果变量没被赋值过,那就给一个默认的default值,如果被赋值过,那就使用那# 个指定的值
echo $ name
echo ${name-default}
#如果变量内容是” “或者变量没初始化则给默认值,可以在-前加一个冒号,:-
[root@localhost ~]:~$ name=""
[root@localhost ~]:~$ echo ${name-default}
[root@localhost ~]:~$ echo ${name:-default}
default
>字符拼接
[root@localhost ~]:~$ echo "aaa""bbb"
aaabbb
[root@localhost ~]:~$ echo "aaa"$str
aaahttps://www.zhihu.com/people/4k8k
[root@localhost ~]:~$ echo "aaa$str"
aaahttps://www.zhihu.com/people/4k8k
>字符串长度:用#
[root@localhost ~]:~$ echo ${#str}
>将字符串split成数组:在以空格为分隔符分割字符串,组成数组时操作最简单。
[root@localhost ~]:~$ s="a b c d e"
[root@localhost ~]:~$ a=($s)
[root@localhost ~]:~$ echo ${a[*]}
a b c d e
[root@localhost ~]:~$ echo ${a[2]}
c
如果需要指定特定字符进行分割,而原字符串中又没有空格时,可以先将特定字符替换成空格,然后按照上述进行分割,如下所示,
[root@localhost ~]:~$ s="a,b,c,d,e"
[root@localhost ~]:~$ a=(${s//,/ })
[root@localhost ~]:~$ echo ${a[*]}
a b c d e
[root@localhost ~]:~$ echo ${a[2]}
c
>>>部完全理解<<<如果字符串中本身已有空格,并且期望的分隔符不是空格,按如下方法进行分割。首先将IFS变量替换成指定字符,分割后再将IFS更新为原字符。
[root@localhost ~]:~$ s="a b,c,d,e"
[root@localhost ~]:~$ old_ifs="$IFS"
[root@localhost ~]:~$ s="a b,c,d,e"
[root@localhost ~]:~$ OLD_IFS="$IFS"
[root@localhost ~]:~$ IFS=","
[root@localhost ~]:~$ a=($s)
[root@localhost ~]:~$ IFS="$OLD_IFS"
[root@localhost ~]:~$ echo ${a[*]}
a b c d e
[root@localhost ~]:~$ echo ${a[0]}
a b
[root@localhost ~]:~$ echo ${#a[*]}
4
>字符串包含:有时候需要判断字符串str1中是否包含字符串str2,使用=~操作符。
str1="hello"
str2="ell"
if [[ $str1 =~ $str2 ]];then
echo "$str1 contains $str2"
fi
6、shell运算
我们经常需要在 Shell 脚本中计算,掌握基本的运算方法很有必要,下面就是 4 种比较常见的运算方法,
功能都是将 m + 1:
\1. m=$[ m + 1 ]
\2. m=expr $m + 1 # 用 “ 字符包起来
\3. let m=m+1
\4. m=$(( m + 1 ))
算术运算符:+、-、*、/、%、=、==、!=
a=10
b=20
val=expr $a + $b
关系运算符 :-eq、-ne、-gt、-lt、-ge、-le
布尔运算:!(非)、-o(或)、-a(与)
字符串运算符:=、!=、-z(字符串长度是否为0)、-n(字符串长度是否不为0)、str(字符串是否为空)
文件测试运算符:
-b file:检查文件是否是块设备文件
-c file:检查文件是否是字符设备文件
-d file:检查文件是否是目录
-f file:检查文件是否是普通文件
-g file:检查文件是否设置了SGID位
-k file:检查文件是否设置了粘着位
-p file:检查文件是否是具名管道
-u file:检查文件是否设置了SUID
-r file:检查文件是否可读
-w file:检查文件是否可写
-x file:是否可执行
-s file:是否为空
-e file:是否存在
7、shell语句
包含分支、跳转、循环
>>>循环接收脚本参数shift
echo '原始参数: ' $*
shift //移除第一个
echo 'shift后参数: ' $*
shift 2 //移除前两个
echo 'shift 2后参数: ' $*12345
>>>if语句:if - else - fi
#!/bin/bash
read VAR
# 下面这两种判断方法都可以,使用 [] 注意左右加空格
#if test $VAR -eq 10
if [ $VART -eq 10 ]
then
echo "true"
else
echo "false"
fi
>>>case语句:case $variable in-----------------esac
case $变量 in
"内容1")
程序1
;;
"内容2")
程序2
;;
*) #匹配其他所有情况
程序3
;;
esac
>>>for 循环:for-------do---------done
>>一般格式:
for var in con1 con2 con3 ...
do
程序
done
示例:for arg in $*
do
echo $arg
done
运行语句:sh script_test.sh a b c d e
>>其他格式
for ((初始值; 目标值; 步长))
do
程序
done
示例:for ((i=1; i<=10; i=i+2))
do
echo $i
done
运行语句: bash script_test.sh
>>>while循环
>while do done,:在while循环中,当条件满足使,就执行其中的程序。
while [ condition ]
do
程序
done
>until do done :当条件不成立时就终止循环
until [ condition ]
do
程序
done
示例:#!/bin/bash
i=0
# i 大于 5 时,循环结束
until [[ "$i" -gt 5 ]]
do
echo $i
i=$[ $i + 1 ]
done
>>>break:跳出循环
for VAR in 1 2 3
do
# 如何 VAR 等于 2 就跳出循环
if [ $VAR -eq 2 ]
then
break
fi
echo $VAR
done
>>>continue:跳过本次循环
#!/bin/bash
for VAR in 1 2 3
do
# 如果 VAR 等于 2,就跳过,直接进入下一次 VAR = 3 的循环
if [ $VAR -eq 2 ]
then
continue
fi
echo $VAR
done
8、shell函数
>>>函数定义
格式一:
function 函数名 () {
指令...
}
格式二:
function 函数名 {
指令...
}
格式三:
函数名 () {
指令...
}
示例:#!/bin/bash
function hello_world(){
echo "hello world fun"
echo $1 $2
return 1
}
function hello_world{
echo "hello world fun"
echo $1 $2
return 1
}
hello()
{
echo "hello fun"
}
>>>函数调用:
# 1. 直接用函数名调用 hello 函数
hello
# 2. 使用「函数名 函数参数」来传递参数
hello_world 1 2 # 1 2就是传递的参数$1 $2这里是使用位置参数传递的
# 3. 使用「FUN=`函数名 函数参数`」 来间接调用
FUN=`hello_world 1 2`
echo $FUN
>>>获取返回值
hello_world 1 2
# $? 可用于获取前一个函数的返回值,这里结果是 1
echo $?
>>>定义本地变量:local
fun()
{
local x=1
echo $x
}
9、shell调试相关的指令
sh -n script_name.sh1 //用来检查是否有语法错误
sh -x script_name.sh1 //执行并调试shell脚本
10、shell易错点
[]内不能嵌套(),可以嵌套[]
$[val+1]是变量加1常用方法
[]array类型·的测试或者计算时,里面的内容最好都加空格
单引号和双引号差不多,单引号更加严格,双引号可以嵌套单引号
一定要注意语句的格式,例如缩进