Shell基本命令---学习笔记

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类型·的测试或者计算时,里面的内容最好都加空格
单引号和双引号差不多,单引号更加严格,双引号可以嵌套单引号
一定要注意语句的格式,例如缩进

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
学习Shell命令时,以下是一些重要的注意事项和学习建议: 1. 基本语法:Shell命令通常由命令名称和参数组成。命令名称是要执行的操作,而参数则提供了命令所需的信息。了解Shell命令基本语法是学习的第一步。 2. 命令帮助:大多数Shell都提供了内置的命令帮助功能。通过使用命令后跟`--help`或`-h`选项,或者使用`man`命令(例如`man ls`)来获取有关特定命令的详细信息。 3. 常用命令:有一些常见的Shell命令对于日常使用非常有用。这些包括`cd`(更改目录)、`ls`(列出目录内容)、`mkdir`(创建目录)、`rm`(删除文件或目录)等。逐步学习和掌握这些命令是很重要的。 4. 管道和重定向:Shell命令非常强大,可以通过管道和重定向符号将多个命令组合在一起。了解如何使用管道(`|`)将一个命令的输出作为另一个命令的输入,并使用重定向符号(`>`、`>>`、`<`)来控制输入和输出。 5. 脚本编写:Shell脚本是一种将多个命令组合在一起以自动化任务的方法。学习如何编写简单的Shell脚本可以提高工作效率。 6. 实践和练习:最重要的是进行实践和练习。尝试使用不同的Shell命令来完成各种任务,并在实际场景中应用所学知识。 记住,Shell命令学习是一个逐步的过程。开始时可能会有些困惑,但随着实践和经验的积累,你会变得越来越熟练。希望这些提示对你有帮助!如有任何具体问题,随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值